当一个类中存在虚函数,则在该类实例化后,在类的开始处存放一个指针,虚函数表指针,指向虚函数地址的指针。大小为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{}