这是我无法理解的代码:
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)的受保护成员,因此它应该编译。
答案 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的答案更正确。