【C++】继承

一、继承的理解及定义

1.1理解

继承,顾名思义,就是一个对象的东西传给了另一个对象。

在C++中,继承也是如此,将一个类的成员传给了另一个对象。实现类的代码复用,就是继承。

1.2句式

继承方式有三种:public(公共)、private(私有)、protected(保护)

继承的方式不同,继承的成员的访问权限也不同。

|---------------|-----------------|-----------------|---------------|
| | public继承 | protected继承 | private继承 |
| 父类public成员 | 子类继承后为public | 子类继承后为protected | 子类继承后为private |
| 父类protected成员 | 子类继承后为protected | 子类继承后为protected | 子类继承后为private |
| 父类private成员 | 子类继承后不可见 | 子类继承后不可见 | 子类继承后不可见 |

如果不写继承方式,那就按默认继承方式继承:

class 默认的继承方式是private

struct的默认继承方式是public

二、子类对父类的赋值

子类拥有父类的成员,故子类可以用一种切割/切片的方法将自身父类的那部分赋值给父类。

但是反过来,父类对象不能给子类赋值。

示例代码:

cpp 复制代码
class A
{
public:
	void func1()
	{
		cout << "func1调用" << endl;
	}
private:
	int val = 0;
};

class B :public A
{
public:
	void func2()
	{
		cout << "func2调用" << endl;
	}
private:
	int sum = 1;
};

int main()
{
	B b;
	A a = b;
	A* pa = &b;
	A& ab = b;
}

*父类指针给子类指针赋值

指针是个神奇的东西,只要将父类指针强转成子类指针就可以赋给子类指针了。

cpp 复制代码
int main()
{
	B b;
	A a;

	A* pa1;
	A* pa2;

	pa1 = &b;//pa1指向b
	B* pb1 = (B*)pa1;//强转成B*后不会访问越界
	pb1->func2();

	pa2 = &a;//pa2指向a
	B* pb2 = (B*)pa2;//强转成B*后指针可能发生访问越界
	pb2->func1();

}

三、父类成员被子类成员隐藏

父类成员和子类成员名字相同同时,子类成员会将父类成员中同名的成员隐藏(也叫重定义)。

父类成员被隐藏后,调用该名字的成员,会默认调用子类中的同名成员。

如果向调用隐藏成员,需要用作用域运算符"::"访问。

*注意:隐藏的条件是只要成员名相同就构成隐藏。

四、子类的默认函数

子类一共有六个默认函数:

构造函数、析构函数、拷贝构造、赋值重载和 普通对象/const对象取地址(这两个基本不用)。

1.1构造函数

子类继承父类后,可以将继承下来的成员看作一个整体,看成一个子类的成员。

子类会优先调用父类的默认构造函数,如果父类没有默认构造函数,则需要在子类的构造函数的初始化列表中显示调用。

1.2拷贝及赋值重载

子类的拷贝构造函数和operate=都要调用父类的拷贝构造函数和oerater=。

1.3析构函数

子类的析构函数会在函数体执行结束前自动调用父类的析构函数。

也就是说,必须先析构子类自身的数据,再析构继承的父类的数据。

五、友元关系不能继承

父类与其他函数的友元关系不能被子类继承。

六、静态成员是所有类共享

静态成员是所有类的共享成员,相同名称只能有一个。且静态成员要在类内声明,类外初始化。

七、菱形继承

7.1菱形继承的坏处

如下图所示的继承就是菱形继承:

此时D中存放的数据:

D中存放了两份A的数据,造成了数据冗余。

7.2虚继承

为了解决菱形继承的问题,出现了虚继承。即谁的数据发生了冗余,就在它的子类继承前加上关键字virtual。

这样数据就不会发生冗余了。

相关推荐
Want59511 分钟前
C/C++跳动的爱心①
c语言·开发语言·c++
lingggggaaaa21 分钟前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
phdsky34 分钟前
【设计模式】建造者模式
c++·设计模式·建造者模式
H_-H35 分钟前
关于const应用与const中的c++陷阱
c++
coderxiaohan41 分钟前
【C++】多态
开发语言·c++
gfdhy1 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
ceclar1231 小时前
C++范围操作(2)
开发语言·c++
一个不知名程序员www2 小时前
算法学习入门---vector(C++)
c++·算法
明洞日记2 小时前
【数据结构手册002】动态数组vector - 连续内存的艺术与科学
开发语言·数据结构·c++
福尔摩斯张2 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法