3

这是我难以理解的代码:

class A 
{ 
protected: 
   int _i; 
   A () : _i(0) { } 
   ~A () { } 
}; 

class B: public A 
{ 
public: 
   A *_pa; 
   B()  : A(), _pa(new A())
   { } 

  ~B () 
   { 
      delete _pa; 
   } 
}; 

int main () 
{ 
   A a; //ERROR
   B b; //ERROR
}

当试图实例化一个类型的类时,A我得到一个错误,因为它的构造函数受到保护。但是为什么我不能实例化一个 type 类B呢?该类可以访问A(包括ctor)的受保护成员,因此它应该编译。

4

4 回答 4

4

从 A 派生仅允许您访问通过“this”或通过另一个 B 访问的受保护成员。B 无权访问 _pa 的受保护成员。

于 2013-02-13T13:59:21.417 回答
4

您的错误位于构造函数new A内部B,而不是对超级构造函数的调用。

让我解释一下如何protected工作。当你有一个类B,它的子类A不能访问受保护的元素时A,它A在处理B引用时可以访问受保护的元素。

为了表明我的观点:

#include <iostream>

class A {
protected:
    int a;
};

class B : public A {
public:
    void do_it(A* a) {
        std::cout << a->a << std::endl; //ERROR
    }
    void do_it(B* a) {
        std::cout << a->a << std::endl; //VALID CODE
    }
};

我猜这种行为背后的原因是,如果您有第三个类C也可以访问A受保护的成员,那么其他人更改这些受保护的值可能不是一个好主意。

于 2013-02-13T14:00:12.350 回答
0

您在main中有错误。在那里你不能实例化 A,因为它的构造函数是受保护的。

此外,您无法_pa在 B 的构造函数中调用构造函数。

于 2013-02-13T13:52:52.880 回答
-1

在 的构造函数中BA调用构造函数。由于A' 构造函数受到保护,在 'A构造函数处调用 ' 构造B函数会出错。同样在受保护的范围内A,还有析构函数。当B' 的析构函数被调用时,它的基类 ( A) 的析构函数也被调用。因为A的析构函数受到保护,所以还会发生另一个错误。如果从A' 的构造函数中取出 ' 的构造B函数,仍然会显示错误。A但是你可以在公开's 析构函数后摆脱错误。

public:
   ~A () { }

这个推断是通过检查代码块给出的错误得出的,但似乎是错误的。删除 _pa(new A()) 是确切的解决方案。@AndréPuel 的回答更正确。

于 2013-02-13T14:39:45.533 回答