类说虚拟继承

class A           //定义一个类A

{

    public:

        A(){cout << "A called"<< endl;}

        void print(){cout << "A print" <<endl;}

    private:

 

};

 

class B          //定义一个类 B

{

    public:

        B(){cout << "B called" << endl;}

        void print(){cout << "B print" << endl;}

    private:

 

};

class C :public A , public B   //定义一个类C 分别继承自 A ,B

{

       public:

        C(){}

    private:

};

int main(void)

{

       C c;

       c.print();    // 看看类A和类B的定义, 在这里编译器不知道要调用那个父类的print()方法。

                         // 应该这样调用:c.A::print()或者 c.B::print() ;

       getchar();

return 0;

}

 

//

class A

{

    public:

        A(){cout << "A called"<< endl;}

        void print(){cout << "A print" <<endl;}

    private:

 

};

 

class B :  public A

{

    public:

        B(){cout << "B called" << endl;}

 

    private:

 

};

class C :  public A

{

    public:

        C(){cout << "C called" << endl;}

           private:

 

};

class D:public B,public C

{

    public:

        D(){cout << "D called" << endl;}

    private:

 

};

int main(void)

{

    D d;

    d.print();             // 在这里编译器也不知道调用那个A的print方法(B的父类还是C的父类). 

                                         // 应该这样调用:c.B::print()或者 c.C::print() ;

    getchar();

    return 0;

}

 

// 解决以上两种情况的另一种方法

//

class B :  virtual public A

{

    public:

        B(){cout << "B called" << endl;}

 

    private:

 

};

class C :  virtual public A

{

    public:

        C(){cout << "C called" << endl;}

           private:

 

};

这样就相当于说,在没有A类的拷贝时就构造一个,如果已经有了,就用已经有的那一个,这样一来,拷贝只有一份了,二义性消除了

//

使用虚拟继承:虚拟继承又称作共享继承,这种共享其实也是编译期间实现的,当使用虚拟继承时,上面的程序将变成下面的形式:

#include <iostream.h>

#include <memory.h>

class CA

{

    int k;

public:

    void f() {cout << "CA::f" << endl;}

};

 

class CB : virtual public CA    // 也有一种写法是class CB : public virtual CA

{                                                           // 实际上这两种方法都可以

};

 

class CC : virtual public CA

{

};

 

class CD : public CB, public CC

{

};

 

void main()

{

    CD d;

    d.f();

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值