2014-09-25 116 views
5
class A{ 
    public: 
    A(); 
    private: 
    ~A(); 
}; 

class B:public A{ 
    public: 
    B(){}; 
    private: 
    ~B(); 
}; 

int main() 
{ 
    return 0; 
} 

我有一个编译错误是这样的:为什么派生的构造函数需要基础析构函数?

test.cpp: In constructor 'B::B()': 
test.cpp:5:4: error: 'A::~A()' is private 
test.cpp:10:8: error: within this context 

我知道派生的构造函数需要调用析构函数的基础,所以我设置A::A()public。 但是,为什么编译器会抱怨它需要公开A::~A()

+0

@EdChum:不,这个问题没有解释为什么派生构造函数需要访问基类的析构函数。 – 2014-09-25 10:38:20

+0

@MikeSeymour是的,你是对的,撤回我的近距离投票 – EdChum 2014-09-25 10:39:25

+0

你*可能*不能构建一个你不能销毁的类,你不能销毁'B',因为析构函数需要访问'〜A()'这是私有的(你需要使其受到保护或“朋友”B级)。 – firda 2014-09-25 10:42:36

回答

0

将构造函数和析构函数声明为public(如果确保仅由子类调用基类构造函数和析构函数,可能会对其进行保护)。当构建子类有基类实例作为cubobject创建的,因此构造函数的显式或隐式调用和析构函数完成

3

的C++标准委员会的核心工作组的缺陷报告1424(2011-12-07由DanielKrügler)说:

当前的规范似乎不说实现是否允许/需要/禁止在子对象的析构函数无法访问时发生投诉。

这是通过加入被析潜在调用的概念的固定在C++ 14。标准节12.6.2(10)当前草案说:

在非委托构造器,析构函数针对每个直接或虚基类和类型的每个非静态数据成员可能会调用(12.4)。

[注意:这个规定确保可以在引发异常(15.2)的情况下为完全构造的子对象调用析构函数。末端音符]

而在12.4(11)

甲析构潜在调用,如果它被调用或如在5.3.4和12.6.2指定。 如果可能调用的析构函数被删除或不能从调用的上下文访问,则程序格式不正确。

相关问题