2013-02-11 82 views
1

我想从类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

你没有遵循三条规则。请阅读有关它。 – 2013-02-11 06:34:52

回答

8

如果基类不具有虚拟析构函数,并且无法修改类定义,那么您几乎不会运气。作为一般的经验法则,您可能不应该对没有虚拟析构函数的基类使用公有继承。

也许你可以尝试使用组合而不是继承?将A的实例放在B中,并提供将成员函数打包为A的公共成员函数。

1

您可以使用struct B : private A使AB不可访问的基础。

+0

但他有:'A * p_a = new B;' – 2013-02-11 04:47:16

+0

如果是这样,调用者不能使用A的公共成员;那不是我想要的。 – xmllmx 2013-02-11 04:47:39

+0

@CharlesSalvia:如果'A'是私人的,那么这是一个错误。 – 2013-02-11 04:48:08

0

只需将数据成员A而不是基类。


顺便说一句,这些类违反三个规则,这是一个邀请灾难。如果复制实例会怎么样。更好地使用标准库容器,而不是显式的newdelete

+0

您能否提供一些示例代码? – 2016-08-19 02:55:11

+0

@袁文:“数据成员”是非常基础的。你正在询问声明一个变量的示例代码。你需要一本教科书。 SO C++ [书目列表](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)可以提供帮助。 – 2016-08-19 11:48:39