C++ 学习(虚基类)

#include <iostream>
//基类
using namespace std;
class CBase
{
protected:
    int a;
public:
    CBase(int na)
    {
        a=na;
        cout<<"CBase constructor! "<<endl;
    }

    ~CBase(){cout<<"CBase deconstructor! "<<endl;}
};

//派生类1(声明CBase为虚基类)
class CDerive1:virtual public CBase
{
public:
    CDerive1(int na):CBase(na)
    {
        cout<<"CDerive1 constructor! "<<endl;
    }

    ~CDerive1(){cout<<"CDerive1 deconstructor! "<<endl;}

    int GetA(){return a;}
};

//派生类2(声明CBase为虚基类)
class CDerive2:virtual public CBase
{
public:
    CDerive2(int na):CBase(na)
    {
        cout<<"CDerive2 constructor! "<<endl;
    }
    ~CDerive2(){cout<<"CDerive2 deconstructor! "<<endl;}
    int GetA(){return a;}
};

//子派生类
class CDerive12:public CDerive1,public CDerive2
{
public:
    CDerive12(int na1,int na2,int na3):CDerive1(na1),CDerive2(na2),CBase(na3)
    {
        cout<<"CDerive12 constructor! "<<endl;
    }
    ~CDerive12(){cout<<"CDerive12 deconstructor! "<<endl;}
};
int main()
{
    CDerive12 obj(100,200,300);
    //得到从CDerive1继承的值
    cout<<" from CDerive1 : a = "<<obj.CDerive1::GetA();
    //得到从CDerive2继承的值
    cout<<" from CDerive2 : a = "<<obj.CDerive2::GetA()<<endl<<endl;
    return 0;
}

 参考: http://blog.chinaunix.net/uid-26983585-id-3309645.html 

             http://blog.csdn.net/livelylittlefish/article/details/2171267

            http://blog.sina.com.cn/s/blog_4a286b4e010125rk.html



  c++ 引入虚基类的原因是多继承产生了二义性。

虚基类的特点:
       虚基类构造函数的参数必须由最新派生出来的类负责初始化(即使不是直接继承);
       虚基类的构造函数先于非虚基类的构造函数执行

 在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间。

虚函数因为存在一个虚函数表,需要4个字节,数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。






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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值