首页  >  文章  >  后端开发  >  可以使用子初始化列表来初始化受保护的父成员吗?

可以使用子初始化列表来初始化受保护的父成员吗?

Barbara Streisand
Barbara Streisand原创
2024-10-24 19:15:02634浏览

Can Protected Parent Members be Initialized Using Child's Initialization List?

使用子类的初始化列表初始化受保护的父类成员

在面向对象编程中,您可能需要初始化在父类中声明的受保护成员来自子类的构造函数。这是一个常见的场景,但问题出现了:可以使用子类的初始化列表来实现吗?

让我们考虑以下示例:

<code class="cpp">class Parent {
protected:
    std::string something;
};

class Child : public Parent {
private:
    Child() : something("Hello, World!") {}
};</code>

当尝试编译此代码时,编译器报告错误:“类‘Child’没有任何名为‘something’的字段”。这个错误表明编译器无法在Child类中找到something成员。

这里的问题在于子类的初始化列表(:something("Hello, World!"))无法访问protected父类的成员。这是因为初始化列表初始化了子类本身的私有成员,而父类的受保护成员无法从子类的私有部分访问。

解决方案:转发构造函数

要解决这个问题,您可以在父类中使用转发构造函数将初始化值传递给受保护的成员:

<code class="cpp">class Parent {
protected:
    Parent(const std::string& something) : something(something) {}
    std::string something;
};

class Child : public Parent {
private:
    Child() : Parent("Hello, World!") {}
};</code>

通过这种方法,子类的构造函数调用父类的构造函数通过 Parent("Hello, World!") 语法。此初始化将 Something 参数传递给父类的构造函数,然后初始化受保护的 Something 成员。

以上是可以使用子初始化列表来初始化受保护的父成员吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn