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

11

我知道私有(当然也包括公共)析构函数的用途。

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

使用受保护的析构函数来防止通过基类指针销毁派生对象

但是我尝试运行下面的代码,它无法编译:

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 调用一个受保护的方法,它将正常工作。那么为什么调用析构函数不同呢?


6
我猜这是一个重复的问题,你不能在派生类的成员函数中调用除了 *this 以外的基类对象的受保护成员函数。 - dyp
相关或重复:https://dev59.com/bWvXa4cB1Zd3GeqPLrT9 - dyp
可能是重复的问题:无法调用基类受保护的函数? - Mat
1个回答

14

protected并不意味着你的 B 可以访问任何一个 A 的成员;它只意味着它可以访问它自己的 A 基类的成员......以及一些其他 BA 基类的成员!

这与 private 相反,因为某些类型为 A 的对象总是可以调用另一个类型为 A 的对象的 private 成员。


2
B的成员函数也可以访问另一个对象中声明为类A的受保护成员,前提是该对象是类型为B或派生自B的。这很令人困惑。 - dyp
1
我将以 public 的方式为你投票,但会以 protected 的方式进行。稍后想私下见面吗? - user155407
@DyP:哦,是的,那是真的。 - Lightness Races in Orbit
1
那么,在多态场景下,如果在运行时使用“A *”来分配“B”实例,会发生什么情况 - “B”不知道实际实例是类型A还是B?基于基础指针的使用导致A不能进行,即使它是一个B实例? - dtech
1
@ddriver:没错!虚拟分派适用于函数调用,但访问限制首先被应用。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接