关于受保护构造函数的一个问题。我了解到受保护的构造函数可以在派生类中使用。然而,我发现下面的代码有错误。为什么会出现这样的情况呢?
class A
{
protected:
A(){}
};
class B: public A {
public:
B() {
A* f=new A(); // Why it is not working here
}
};
这与具体的构造函数无关。就是这样protected
访问工作。
The way protected
访问说明符有效,它允许派生类B
访问基类对象的内容A
仅当该类的对象A
是类的子对象B
。这意味着您在代码中唯一可以做的就是访问A
through B
: 您可以访问以下成员A
通过类型指针B *
(或类型的引用B &
)。但是你cannot通过类型指针访问相同的成员A *
(或参考A &
).
考虑下面的例子
class A {
protected:
int i;
};
class B : A {
void foo() {
i = 0; // OK
this->i = 0; // OK
B *pb = this;
pb->i = 0; // OK
A *pa = this;
pa->i = 0; // ERROR
((A *) this)->i = 0; // ERROR
}
};
在上面的B::foo
,您可以访问基础成员A::i
通过使用简单的i
句法。这相当于使用this->i
句法。两者都可以工作,因为指针this
有类型B *
,即您正在访问A::i
彻底的类型指针B *
。这正是protected
访问说明符应该允许。访问通过pb
指针的工作原理完全相同。
然而,当你“转变”时this
指向类型的指针A *
,您无法再访问A::i
通过这个新指针,即使您仍然尝试访问它们与以前相同的成员。
当应用于构造函数时,protected
访问说明符具有非常具体的作用:受保护的构造函数只能用于初始化基类子对象。它不能用于初始化独立对象(这正是您想要做的)。换句话说,受保护的构造函数是实现概念的另一种方式抽象类在 C++ 中(以及纯虚方法)。如果类的构造函数受到保护,那么您的类实际上是受保护的abstract。您不能使用它来“从外部”定义独立的对象。 (当然,上述内容不适用于朋友内部以及班级本身)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)