虚继承也是多继承的一扩展,它可以很好解决(三角问题)
在C++K ,能用类来解决问题,不要用组合
能用类和组合来解决问题,不要用继承
能用单继承解决,不要多继承
组合:电脑类包含了cpu,硬盘,内存,它们又都是一个独立的类,而他们又是电脑类中 的一个成员变量
虚继承语法:在继承过程中,在继承方式之前增加关键字(virtual)
class 派生类: virtual pubic 基类
{
};
虚继承分析:
代码:
//虚基类:被虚继承类,通常叫作虚基类
class A //虚基类,在通常情况下,不会去实例化对象
{
public:
A()
{
//data = 100;
cout << " A()" <<endl;
}
int data;
};
//虚继承
class X :virtual public A
{
public:
X()
{
data = 200;
cout << " X()" <<endl;
}
};
//虚继承
class Y: virtual public A
{
public:
Y()
{
data = 300;
cout << " Y()" <<endl;
}
};
class Z :public X,public Y
{
public:
Z()
{
data = 400;
cout << " Z()" <<endl;
}
void printZ()
{
cout << A::data << endl;
cout << "data = " << data << endl; //在孙子类中,使用祖父类中成员,不会出现二义性
}
};
int main()
{
Z z;
z.printZ();
return 0;
}
虚继承意义:
在多继承中,保存共同基类的多份同名成员,虽然有时候是必要的,可以在不同的数据成员中分别存放不同数据,但是,在大多数情况下,是我们不想。因为保留多份数据成 员拷贝 ,不仅占有较多的空间,还增加了访问困难,C++中,提供了虚基类和虚继承机制,实现在多继承中只保留一份共同成员。
虚继承机是它编译器来维护,使用关键字来实现虚继承后,该类中就会多一个vptr指针,VPTR指针也是由编译器来维护,引入虚继承可以节省空间。
//共同成员少
// cout << sizeof(X) << sizeof (Y) << sizeof ( Z) << endl; 8 8 12 --- X Y 各多了一个VPTR指针 虚继承的情况下:
// cout << sizeof(X) << sizeof (Y) << sizeof ( Z) << endl; //4 4 8 --- 普通继承 12>8
//如果虚基类共成的成员,比较少的情况下,反而因为vptr指针,而使用更多的空间,但是在共同的成员比较多的情况下
//才会更好的节省空间
//共同成员多
//cout << sizeof(X) << sizeof (Y) << sizeof ( Z) << endl; // ---> 普通继承 24 24 48
cout << sizeof(X) << sizeof (Y) << sizeof ( Z) << endl; //虚继承 ---> 28 28 32 32 <48
//查看Z的字节数,会越来越节省空间
在继承中,多个不同的父类指针指向同一个子类
选择继承的分析:
|