How to correctly inherit from a base class whose destructor is not virtual?
我想从类A继承,但A的析构函数不是虚拟的,我不能修改A的定义。如何避免以下情况?
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 | struct A { A() : a(new char[8]) {} ~A() { delete[] a; } char* a; } struct B : A { B() : A(), b(new char[8]) {} ~B() { delete[] b; } char* b; }; int main() { A* p_a = new B; delete p_a; // How to avoid such a dangerous deletion? } |
如果基类没有虚拟析构函数,并且您不能修改类定义,那么您就太走运了。作为一般经验法则,您可能不应该将公共继承与没有虚拟析构函数的基类一起使用。
也许你可以尝试使用组合而不是继承?在
您可以使用
只需将
顺便说一下,这些类违反了三原则,这是一种灾难的邀请。如果一个实例被复制了怎么办?最好使用标准库容器,而不是显式的