我想从A类继承,但A的析构函数不是虚拟的,我无法修改A的定义。如何避免以下情况?
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?
}
答案 0 :(得分:8)
如果基类没有虚拟析构函数而你无法修改类定义,那么你几乎没有运气。作为一般经验法则,您可能不应该将公共继承与没有虚析构函数的基类一起使用。
也许您可以尝试使用合成而不是继承?在A
中放置B
的实例,并提供包含对A
的成员函数的调用的公共成员函数。
答案 1 :(得分:1)
您可以使用struct B : private A
,以便A
无法访问B
。
答案 2 :(得分:0)
只需使A
成为数据成员而不是基类。
顺便说一下,这些课程违反了三级规则,这是对灾难的邀请。如果复制实例该怎么办?更好地使用标准库容器而不是显式new
和delete
。