#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个字节
虚继承又叫共享继承,当两个类虚继承同一个类时,此时又一个类继承这两个虚继承的类时对于基类只有一份拷贝
看下图:
非虚继承 虚继承