虚函数相关代码及结果

it2022-05-05  257

情况1:

class A { public: int A_1; int A_2; // virtual void aa() {}; }; class B :public virtual A{ public: int B_1; int B_2; int B_3; //virtual void aa() {}; //virtual void bb() {}; }; class C :public virtual B { char i[3]; public: virtual void cc() {}; };

 结果:(32位)8、24、36

情况二:

#include "stdafx.h" #include<vector> #include<iostream> using namespace std; class A { public: int A_1; int A_2; virtual void aa() {}; }; class B :public A{ public: int B_1; int B_2; // virtual void aa() {}; virtual void bb() {}; }; class C :public virtual B { char i[3]; public: virtual void cc() {}; }; int main(int argc,char *argv[]) { B b; cout << "sizeof(A)=" << sizeof(A) << endl; cout << "sizeof(b)=" << sizeof(B) << endl; cout << "sizeof(C)=" << sizeof(C) << endl; return 0; }

结果: (32位)12、20、32

情况三:

class A { public: int A_1; int A_2; virtual void aa() {}; }; class B :public A{ public: int B_1; int B_2; int B_3; // virtual void aa() {}; virtual void bb() {}; }; class C :public virtual B { char i[3]; public: virtual void cc() {}; }; int main(int argc,char *argv[]) { B b; cout << "sizeof(A)=" << sizeof(A) << endl; cout << "sizeof(b)=" << sizeof(B) << endl; cout << "sizeof(C)=" << sizeof(C) << endl; return 0; }

 结果:(32位)12、24、36

情况四:存在多态的情况下

class A { public: int A_1; int A_2; virtual void aa() {}; }; class B :public A{ public: int B_1; int B_2; int B_3; virtual void aa() {}; virtual void bb() {}; }; class C :public virtual B { char i[3]; public: virtual void cc() {}; };

 结果:(64位编译器)16、32、56     (32位编译器)12、24、36

情况五:虚继承: 

虚继承的时候子类会有一个指向自己虚函数表的指针,同时也会加入一个指向父类的虚类指针,然后还要包含父类的所有内容。

虚继承时如果子类父类都有虚函数,那么它会重新建立一张虚表,不包含父类虚表的内容;而在普通的继承中却是在父类虚表的基础上建立一张虚表。这就意味着如果虚继承中子类父类都有各自的虚函数,在子类里面就会有两个虚函数表指针,一个指向父类的虚表,一个指向子类的虚表,而普通的继承只有一个指向子类虚表的指针

class A { public: int A_1; int A_2; virtual void aa() {}; }; class B :public virtual A{ public: int B_1; int B_2; int B_3; //virtual void aa() {}; virtual void bb() {}; }; class C :public virtual B { char i[3]; public: virtual void cc() {}; }; int main(int argc,char *argv[]) { A a; B b; C c; cout << "sizeof(A)=" << sizeof(A) << endl; cout << "sizeof(b)=" << sizeof(b) << endl; cout << "sizeof(C)=" << sizeof(C) << endl; return 0; }

结果:(64位编译器)16、48、72,(32编译器)12、32、44

此时内存分布如下

 


最新回复(0)