GCC生成的虚表

虚表


GCC编译器的虚表位置


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


无继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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;
}




单重继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#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;
}




多重继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#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;
}




虚继承


菱形继承

文章目录
  1. 1. 虚表
    1. 1.0.1. 无继承
    2. 1.0.2. 单重继承
    3. 1.0.3. 多重继承
    4. 1.0.4. 虚继承
    5. 1.0.5. 菱形继承
|