多继承
概述:子类继承于多个父类。
多继承的格式:
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(虚基类表 ) 保存了当前的虚指针相对于虚基类的首地址的偏移量