虚继承及其使用

虚继承也是多继承的一扩展,它可以很好解决(三角问题)

在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的字节数,会越来越节省空间

在继承中,多个不同的父类指针指向同一个子类

选择继承的分析:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值