虚基类

     多继承体系中:  
        class   B{};  
        class   A   :   public   B{};  
        class   C   :   public   B{};  
        class   D   :   public   A,   public   C{};  
        A里有个B,C里也有个B,则D里会有两个B。  
        如果  
        class   B{};  
        class   A   :   virtual   public   B{};  
        class   C   :   virtual   public   B{};  
        class   D   :   public   A,   public   C{};  
        B是A,C,以及更高层D的虚基类,此时  
        A里有个B,C里也有个B,但D里只有一个B,这就是虚基类的作用。

抽象类:是指包含纯虚函数的类,纯虚函数形如: virtual  type   function()   =   0; ,这样的类不能用来定义对象。此种类的重要作用就是定义一个统一的接口。
========================

#include <iostream.h>
class A{
public:
void fn(){cout<<"A: fn()"<<endl;}
};
class B1: virtual public A{ //虚拟继承
public:
void fn(){cout<<"B1: fn()"<<endl;}
};
class B2: virtual public A{ //虚拟继承
public:
void fn(){cout<<"B2: fn()"<<endl;}
};
class C1: public B1 { };
class C2: public B2 { };
class D: public C1,public C2 {};
void main()
{D obj;
obj.C1::fn();
obj.C2::fn();
obj.A::fn(); //可以执行,无二义性
}

  在本例中,若类A不是虚基类,则语句obj.A∷fn()就不能执行,这是因为计算机无法确定是执行B1继承的基类A的函数,还是执行B2继承的基类A的函数,具有二义性。A为虚基类就只有一个基类副本。

==============================

class Base1 {
public:
    Base1(void) {
    cout << "class Base1" << endl;
    }
};
class Base2 {
public:
    Base2(void) {
    cout << "class Base2" << endl;
    }
};
class Level1:virtual public Base2,public Base1 {
public:
    Level1(void) {
    cout << "class Level1" << endl;
    }
};
class Level2:public Base2,virtual public Base1 {
public:
    Level2(void) {
    cout << "class Level2" << endl;
    }
};
class Leaf:public Level1,virtual public Level2 {
public:
    Leaf(void) {
    cout << "class Leaf" << endl;
    }
};
     
int main(void) {
    Leaf obj;
    return 0;
}
遵循两个原则,而且按顺序优先满足:1 先调用完所以基类,再调用子类;2 先调用虚拟基类,再调用非虚拟基类。
Base2
Base1
Base2
Level2
Base1
Level1
Leaf

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值