c++从父类实例化 protected 成员

标签 c++ inheritance

<分区>

下面的代码显示了 2 个类 person 和 trouble_maker。在这个例子中,我有点困惑为什么 trouble_maker 类不能直接在实例化列表中设置它从 person 继承的变量名。为什么必须先创建 trouble_maker 对象才能设置变量名?

#include <string>
class person {
    int age;
public:

    person(int age);
protected:
    std::string name;

};

person::person(int age) : age(age) {

}
class trouble_maker : person {
public:
    trouble_maker(std::string name, int age);
};

trouble_maker::trouble_maker(std::string name, int age) : person(age), name(name) //name is not a static memeber
{
    this->name = name; // works fine
}

int main() {
    person a_person();

    return 0;
}

最佳答案

: 之后的成员初始化列表在构造函数头之后不做任何变量赋值。相反,它为每个非静态直接数据成员和类的基类指定一个初始化器,这些成员或基类将使用该初始化器进行初始化。

name 不是 trouble_maker 的直接成员。初始化它不是 trouble_maker 的工作。那是的工作。

成员和基类是自上而下初始化的。首先初始化基类,然后初始化该类的直接成员。当创建并初始化 person 子对象时,派生的 trouble_maker 对象甚至还不存在。因此必须是 person 初始化 name

如果你想在 trouble_maker 中以不同于 person 的方式初始化 name,你需要为 person 编写一个构造函数code> 为 trouble_maker 进行初始化。 trouble_maker 然后可以在成员初始值设定项列表中调用此构造函数,就像您在此处所做的一样:: person(age),

后面的this->name = name;不是初始化,而是赋值。由于您将 name 设置为 protected 而不是 private,因此 trouble_maker 可以分配给 name,但它仍然无法在不通过 person 的构造函数的情况下初始化 name

关于c++从父类实例化 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59009205/

相关文章:

c++ - C++:将控制台输出存储在宏中是否更好?

c# - C# 中的继承 - 简单问题

inheritance - 接口(interface)扩展了 GraphQL Schema 中的多个接口(interface)

c++ - 使用 DFT 的一维热方程产生不正确的结果 (FFTW)

java - 接口(interface)演化——继承返回类型

java - 使用接口(interface)的默认方法实现方法 - 矛盾吗?

javascript - 组合/继承/工厂 - 此案例的最佳模式

c++ - 如何在Cygwin中更改C++编译器?

c++ - 在 Windows 7 中安装 Subversion(以及一般的 C 库)

c++ - 广泛使用的模板为链接器做了多少工作?