浅谈C++虚基类

来源:互联网 发布:淘宝氛围图是什么样的 编辑:程序博客网 时间:2024/06/14 23:07

大家都知道C++是支持多重继承的,那么就会遇到这样一个问题。如果一个派生类的多个基类是从一个共同的基类派生出来的,那么这个派生类会出现多个最底层基类的拷贝,程序中如何分辨呢。虚基类是让基类只有一个拷贝,程序中就不会出现不确定性。虚基类在派生类中声明:格式如下:class 派生类名:virtual 继承方式 基类。光看文字会有些晕,下面上代码:

class base {

 public :

 base() {

  cout<<"基类base的构造函数"<<endl; 

 }

 ~base() {

   cout<<"基类base的析构函数"<<end;

  }

};

class A:virtual public base{

 public :

 A() {

  cout<<"基类A的构造函数"<<endl; 

 }

 ~A() {

   cout<<"基类A的析构函数"<<end;

  }

};

class B:virtual public base{

 public :

 B() {

  cout<<"基类B的构造函数"<<endl; 

 }

 ~B() {

   cout<<"基类B的析构函数"<<end;

  }

};

class C:public A,public B{

 public :

 C() {

  cout<<"基类C的构造函数"<<endl; 

 }

 ~C() {

   cout<<"基类C的析构函数"<<end;

  }

};

void main() {

 C p;

}

执行结果如下:

基类base的构造函数

基类A的构造函数

基类B的构造函数

基类C的构造函数

基类B的析构函数

基类A的析构函数

基类base的析构函数

 

如果未使用虚基类那么程序结果为:

基类base的构造函数

基类A的构造函数

基类base的构造函数

基类B的构造函数

基类C的构造函数

基类B的析构函数

基类base的析构函数

基类A的析构函数

基类base的析构函数

此时类base有2个拷贝,当创建C的对象时,需要逐层次的向前进行访问,出现基类base被构造2次。

注意:一个类由多个基类派生出来,则虚基类的构造函数优先于非虚基类的构造函数的执行。

原创粉丝点击