由于父保护构造函数,c ++无法实例化子类?

时间:2013-02-13 13:50:24

标签: c++ inheritance

这是我无法理解的代码:

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的类时,我收到错误,因为它的构造函数受到保护。但为什么我不能实例化类B的类?该类可以访问A(包括ctor)的受保护成员,因此它应该编译。

4 个答案:

答案 0 :(得分:4)

您的错误位于new A构造函数中的B,而不是调用super的构造函数。

让我向您解释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也可以访问{{1}}受保护的成员,那么其他人可能不会更改这些受保护的值。< / p>

答案 1 :(得分:3)

从A派生只允许您访问通过“this”或通过其他B访问的受保护成员.B无法访问_pa的受保护成员。

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

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

public:
   ~A () { }

通过检查代码块给出的错误来进行此推论,但似乎是错误的。删除_pa(新的A())是确切的解决方案。@AndréPuel的答案更正确。