GCC生成的虚表

来源:互联网 发布:win10 数据恢复 编辑:程序博客网 时间:2024/06/06 01:34

虚表


GCC编译器的虚表位置


在有虚析构时, 会自动产生一个虚析构代理
虚析构代理的功能:析构对象, 并删除对象的空间
虚析构,无关写在那,都会在虚表中的第一项


无继承

#include <stdio.h>class CTest{public :    CTest()    { m_Num1 = 1; printf("CTest"); }    virtual  ~CTest()    { printf("~CTest"); }     virtual void Test()    { printf("Test"); }private:    int m_Num1;};int main(int argc, char* argv[]){    CTest test;    printf("end\r\n");    return 0;}




单重继承

#include <stdio.h>class CBase{public:    CBase()    { m_Num1 = 1; printf("CBase"); }    virtual ~CBase()    { printf("~CBase"); }    virtual void Test1()    {  printf("CBase::Test1"); }    virtual void Test2()    { printf("CBase::Test2"); }private:    int m_Num1;};class CSub: public CBase{public:    CSub()    { m_Num1 = 2; printf("CSub"); }    virtual ~CSub()    { printf("~CSub"); }    virtual void Test1()    { printf("CSub::Test1"); }    virtual void Test3()    { printf("CSub::Test3"); }private:    int m_Num1;};int main(int argc, char* argv[]){    CSub test;    printf("end\r\n");    return 0;}




多重继承

#include <stdio.h>class A{public:    A()    { m_Num1 = 1; printf("A::A"); }    virtual ~A()    { printf("A::~A"); }    virtual void Test1()    { printf("A::Test1"); }    virtual void Test2()    { printf("A::Test2"); }private:    int m_Num1;};class B{public:    B()    { m_Num1 = 2; printf("B::B"); }    virtual ~B()    { printf("B::~B"); }    virtual void Test3()    { printf("B::Test3"); }    virtual void Test4()    { printf("B::Test4"); }private:    int m_Num1;};class C : public A, B{public:    C()    { m_Num1 = 3; printf("C::C"); }    virtual ~C()    { printf("C::~C"); }    virtual void Test1()    { printf("C::Test1"); }    virtual void Test3()    { printf("C::Test3"); }    virtual void Test5()    { printf("C::Test5"); }private:    int m_Num1;};int main(int argc, char* argv[]){    C test;    printf("end\r\n");    return 0;}




虚继承


菱形继承

0 0