gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:27:54 25 4
gpt4 key购买 nike

这是我难以理解的代码:

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

最佳答案

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

让我来解释一下 protected 是如何工作的。当你有一个 B 类时,它是 A 的子类,它无权访问 A 的 protected 元素,但它可以访问 protected 元素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 protected 成员,那么其他人可能不是一个好主意更改这些 protected 值。

关于由于父保护构造函数,C++ 无法实例化子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14855096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com