虚函数表指针和虚继承

来源:互联网 发布:mac新建智能文件夹 编辑:程序博客网 时间:2024/06/07 11:14

当一个类中存在虚函数,则在该类实例化后,在类的开始处存放一个指针,虚函数表指针,指向虚函数地址的指针。大小为4字节。而不是在类开始处存放多个虚函数的地址。下面是实验的例子:

#include <iostream>

using namespace std;

class A{
public:
 virtual void f() {cout<<"f,A"<<endl;};
 virtual void d(){};
private:
 int x;
 int y;
};

class B{
public:
 virtual void f() {cout<<"f,B"<<endl;};
private:
 int x;
 int y;
};

class C:public A{
};

class device: public A,B{
public:
 
 virtual void f() {cout<<"f,device"<<endl;};
    virtual void g() {cout<<"g,device"<<endl;};
 virtual void ffg() {cout<<"g,device"<<endl;};
};

int main()
{
 cout<<sizeof(int)<<endl;
 cout<<sizeof(A)<<endl;
 cout<<sizeof(B)<<endl;
 cout<<sizeof(C)<<endl;
 cout<<sizeof(device)<<endl;

 return 0;
}

结果:

4

12

12

12

24

A:x,y,虚函数指针,12字节。同理B、C

device:拥有A的虚函数表指针、x、y(12字节)和B的虚函数表指针、x、y(12字节),所以在栈中占用内存是24字节

以上即是多态的实现。

还有一种钻石型多重继承(也是一种虚继承),继承形式如下:

                A

            /         \   

         B           C

            \        / 

               D

实现:

class A{}

class B:public virtual A{}

class C:public virtual A{}

class D:pulic B,C{}