【发布时间】:2020-04-08 14:40:13
【问题描述】:
所以我一直试图通过 C++ 理解 OOP 概念,但是我无法获得虚拟析构函数的某些部分。
我写了一个小sn-p:
class A{
int x;
public:
virtual void show(){
cout << " In A\n";
}
virtual ~A(){
cout << "~A\n";
};
};
class B: public A{
int y;
public:
virtual void show(){
cout << " In B\n";
}
virtual ~B(){
cout << "~B\n";
};
};
class C: public A{
int z;
public:
virtual void show(){
cout << " In C\n";
}
virtual ~C(){
cout << "~C\n";
};
};
class E: public A{
int z;
public:
virtual void show(){
cout << " In E\n";
}
virtual ~E(){
cout << "~E\n";
};
};
class D: public B , public C , public E{
int z1;
public:
virtual void show(){
cout << " In D\n";
}
virtual ~D(){
cout << "~D\n";
};
};
signed main(){
// A * a = new A();
// B *b = new B();
D *d = new D();
B *b = d;
C *c = d;
E * e = d;
A * a = new A();
cout << d << "\n";
cout << b << "\n";
cout << c << "\n";
cout << e << "\n";
delete b;
// a -> show();
}
在运行代码时,我得到的结果是:
0x7f8c5e500000
0x7f8c5e500000
0x7f8c5e500018
0x7f8c5e500030
~D
~E
~A
~C
~A
~B
~A
现在三个问题:
- 根据维基百科文章virtual_table,提到对象 c 的地址比 d 和 b 的地址 +8 个字节,如果是 e 会发生什么。
- 当我调用delete b而不是delete d时,也得到相同顺序的虚析构函数,那为什么派生类析构函数叫
- 只有当我删除一个对象时才会调用虚拟析构函数,然后在程序结束时如何删除 vtable 和 vpointers(当我在没有
delete d的情况下运行代码时,执行只是停止而不打印任何内容)。李>
【问题讨论】:
-
是关于虚拟继承的吗?
标签: c++ oop destructor vtable virtual-destructor