为什么我们不能从派生类中调用受保护的析构函数?

时间:2013-10-19 17:27:13

标签: c++ oop inheritance c++11 destructor

我知道使用私有(当然还有公共的)析构函数。

我也知道在派生类中使用受保护的析构函数:

  

使用受保护的析构函数来防止通过基类指针

破坏派生对象

但是我已经尝试运行以下代码并且无法编译:

struct A{
    int i;
    A() { i = 0;}
    protected: ~A(){}
};

struct B: public A{
    A* a;
    B(){ a = new A();}
    void f(){ delete a; }
};


int main()
{
   B b= B();
   b.f();
   return 0;
}

我明白了:

void B::f()':
main.cpp:9:16: error: 'A::~A()' is protected

我错过了什么?

如果我从f()内部调用A中的受保护方法,它将起作用。那么为什么叫d tor不同呢?

1 个答案:

答案 0 :(得分:12)

protected并不意味着您的B可以访问任何 A的成员;它只表示它可以访问自己的A基地的成员......以及其他B A基地的成员!

这与private形成对比,因此某些类型为A的对象始终可以调用类型为{{1}的另一个对象的private成员}。