3

以下代码将导致C4624。但是你可以看到 D 不是 B 的子类。为什么仍然得到这个警告?谢谢!

class B {
// Uncomment the following line to resolve.
// public:
~B();
};

class D  {B b;};   // C4624 B's destructor not public

有关警告的更多详细信息:

C4624:“派生类”:无法生成析构函数,因为基类析构函数不可访问

析构函数在基类中不可访问,因此不会为派生类生成。任何在堆栈上创建此类型对象的尝试都将导致编译器错误。

4

2 回答 2

2

类成员由类的构造函数初始化并由其析构函数销毁。因此,它们的构造函数和析构函数必须在这些函数中是可访问的。

在您的示例中,B有一个私有析构函数,因此无法访问 的析构函数D,这需要它销毁其类型的成员B

我不知道为什么错误消息指的是“基类”。如果您从发布的代码中收到该错误消息,那么您的编译器可以对其诊断进行一些改进。

于 2012-12-04T14:24:17.980 回答
0

因为班级D不是班级的朋友,班级B也不B是班级的一部分D。这意味着B' 的私有部分无法从D. 这也意味着您不能创建类型D或堆栈上的对象,因为当对象超出范围并应该被删除时,B它需要析构函数可访问。B请注意,错误消息似乎不正确,就像@R.MartinhoFernandes 准确提到的那样。如果您自己管理内存(如此处所述) ,则可以使用私有析构函数。

于 2012-12-04T14:27:07.153 回答