C++之多继承和虚继承

多继承

概述:子类继承于多个父类。
多继承的格式:

class 子类: 继承方式1 父类名1,继承方式2 父类名2,继承方式3 父类名3,....
{

};
//表示子类 是由 父类名1,父类名2,父类名3...共同派生出来

注意:多继承容易产生二义性
解决办法:使用作用域访问成员

class Base1
{
public:
	int a;
};
class Base2
{
public:
	int a;
};
class Son : public Base1,public Base2
{

};
int main(int argc,char *argv[])
{
	Son ob;
	ob.Base1::a=100;
	ob.Base2::a=200;
	return 0;
}

虚继承

virtual修饰的继承方式

//继承的动作 虚继承
//父类:虚基类
class 子类:virtual public 父类
{
};

**注意:**不管继承多少次 虚基类 只有一份数据。
案例:菱形继承

#include <iostream>

using namespace std;
class Animal
{
public:
    int data;
};
class Sheep:virtual public Animal
{
public:

};
class Tuo:virtual public Animal
{
public:

};
class SheepTuo:public Sheep,public Tuo
{
public:
};
int main(int argc, char *argv[])
{
    SheepTuo ob;
    ob.data=10;//如果没有虚继承Sheep  Tuo,编译器不知道给哪个data 幅值,产生二义性
    ob.Sheep::data=100;//可以使用作用域
    ob.Tuo::data=200;

    return 0;
}

**总结:**虚继承只能解决具备公共祖先的多继承(菱形继承)所带来的二义性问题,不能解决没有公共祖先的多继承的。

class Animal
{
public:
    int data;
};
class Sheep:virtual public Animal
{
public:

};

在这里插入图片描述
在这里插入图片描述
vbptr(虚基类指针) 其中v是virtual 虚 b是base 基类 prt指针
(vbptr指向虚基类表)
vbtable(虚基类表 ) 保存了当前的虚指针相对于虚基类的首地址的偏移量

发布了24 篇原创文章 · 获赞 13 · 访问量 3117

猜你喜欢

转载自blog.csdn.net/Evan_work/article/details/105103465