虚拟继承分析

 

#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()

{

    cout<<sizeof(CD)<<endl;

}

输出是:12    int k;占四个字节。CB里面的vbptr和CC里面的vbptr指针各占4个字节。

 

 

#include <iostream.h>

#include <memory.h>

class CA

{

    int k;

public:

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

};

 

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

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

};

 

class CC : public CA

{

};

 

class CD : public CB, public CC

{

};

 

void main()

{

    cout<<sizeof(CD)<<endl;

}

 

输出是:8   CB里面的 int k和CC里面的 int k,各占4个字节。

 

 

 

#include <iostream.h>

#include <memory.h>

class CA

{

    int k;

public:

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

};

 

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

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

};

 

class CC : public CA

{

};

 

class CD : public CB, public CC

{

};

 

void main()

{

    cout<<sizeof(CD)<<endl;

}

输出是:16 CB里面int k和vbtr指针以及CC里面的intk和vbtr指针。


 

#include <iostream.h>

#include <memory.h>

class CA

{

    int k;

public:

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

};

 

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

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

};

 

class CC : public CA

{

};

 

class CD : public CB, public CC

{

};

 

void main()

{

    cout<<sizeof(CD)<<endl;

}

 

输出是:20 CB里面的int k,vbptr(虚继承)指针和vbtr指针以及CC里面的int k和vbtr指针。

 

 

#include <iostream.h>

#include <memory.h>

class CA

{

    int k;

public:

   virtual 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()

{

    cout<<sizeof(CD)<<endl;

}

 

输出是:16  CA里面的int k ,vbtr指针  8个字节。CB里面的vbptr指针4个字节,CC里面的vbptr指针4个字节

 

 

虚继承又叫共享继承,当两个类虚继承同一个类时,此时又一个类继承这两个虚继承的类时对于基类只有一份拷贝

 

看下图:

 

虚拟继承分析                       virtualinheritance

                     非虚继承                                                                   虚继承

 

 

             虚拟继承分析                                                    虚拟继承分析

 

 

 

 

 

你可能感兴趣的:(继承)