下面简单图示说明使用gcc 4.6在x86 ubuntu上vptr和vtbl(以及VTT)布局。
关于VTT的参考连接:
http://stackoverflow.com/questions/6258559/what-is-the-vtt-for-a-classios
根据我本身的验证,获得下面的结论:ubuntu
测试代码以下(主要考察是否有虚函数以及public和virtual继承的差异):segmentfault
1 #include <iostream> 2 3 class NoVirtualFunc{ 4 int a; 5 double b; 6 char c; 7 }; 8 9 class VirtualFunc{ 10 int x; 11 double y; 12 char z; 13 public: 14 virtual void vfunc1(){} 15 }; 16 17 class PublicDerivedFromNoVirtualFunc: public NoVirtualFunc{ 18 int pdfnvf; 19 }; 20 21 class PublicDerivedFromVirtualFunc: public VirtualFunc{ 22 int pdfvf; 23 }; 24 25 class VirtualDerivedFromNoVirtualFunc: virtual NoVirtualFunc{ 26 int vdfnvf; 27 }; 28 29 class VirtualDerivedFromVirtualFunc: virtual VirtualFunc{ 30 int vdfvf; 31 }; 32 33 class PublicMultiple: public NoVirtualFunc, public VirtualFunc{ 34 int pm; 35 }; 36 37 class VirtualMultiple: virtual NoVirtualFunc, virtual VirtualFunc{ 38 int vm; 39 }; 40 41 class AnotherVirtualFunc{ 42 char c; 43 public: 44 virtual void g(){} 45 }; 46 47 class PublicMultipleTwoVirtual:public VirtualFunc, public AnotherVirtualFunc{ 48 char pmtv; 49 }; 50 51 class VirutalMultipleTwoVirtual:virtual VirtualFunc, virtual AnotherVirtualFunc{ 52 char vmtv; 53 }; 54 55 int main(void) 56 { 57 NoVirtualFunc o1; 58 VirtualFunc o2; 59 60 PublicDerivedFromNoVirtualFunc o3; 61 PublicDerivedFromVirtualFunc o4; 62 63 VirtualDerivedFromNoVirtualFunc o5; 64 VirtualDerivedFromVirtualFunc o6; 65 66 PublicMultiple o7; 67 VirtualMultiple o8; 68 69 AnotherVirtualFunc o9; 70 PublicMultipleTwoVirtual o10; 71 VirutalMultipleTwoVirtual o11; 72 73 return 0; 74 }
const成员函数
const能够修饰成员函数来避免成员函数对this指针的修改。
当成员函数的const和non-const版本都存在时,const成员只能调用const版本,
non-const成员只能调用non-const版本。函数
咱们能够对operator new和operator delete进行各类版本的重载,可是每一个版本都须要有本身的独特参数序列
其中第一个参数必须是size_t.
对于operator delete的各类重载版本,它们虽然能够被重载,可是不会被delete调用,只有当new 调用的构造函数抛出异常时,它们才会被调用,用来清除申请失败对象的内存。
关于operator new和 operator delete的具体讨论见此次做业。operator new与 delete重载布局
固然咱们也能够经过使用域做用符::来强制使用全局new和全局delete,调用方法是::new和::delete测试