多继承
//多继承
class C1{
public:
string name;
};
class C2 {
public:
string name;
};
class C3 :public C1,public C2 {
};
int main() {
C3 a;
a.name = "233"; //不明确 报错
a.C1::name = "233"; // 指定具体的name 修复
}
菱形继承
//菱形继承
class Person
{
public:
string _name; // 姓名
};
class Student : public Person //public virtual Person 能避免混淆
{
protected:
int _num; //学号
};
class Teacher : public Person //加入 virtual 才能避免混淆
{
protected:
int _id; // 职工编号
};
class Assistant : public Student, public Teacher
{
protected:
string _majorCourse; // 主修课程
};
int main()
{
Assistant a;
a._name = "peter"; //成员混淆,使用virtual 虚继承解决
a.Student::_name = "1";//指定具体在哪里也可以
a.Teacher::_name = "2";
}
vbptr(虚基类指针) 其中v是virtual 虚 b是base 基类 prt指针
(vbptr指向虚基类表)
vbtable(虚基类表 ) 保存了当前的虚指针相对于虚基类的首地址的偏移量
总结:之所以 产生 vbptr和vbtable 目的 保证 不管多少个继承 虚基类的数据只有一份
继承类型
当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。
我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:
公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。
保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。
私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。
继承中的构造函数与析构函数调用顺序
在vs2019下:
构造函数从父类开始 ,根据继承从左到右的顺序一次开始执行构造函数
析构函数从子类开始,根据继承从右到左的顺序一次开始执行析构函数
参考
https://www.runoob.com/cplusplus/cpp-inheritance.html
https://www.colorgg.com 深蓝旭