使用子类的初始化列表初始化受保护的父类成员
在面向对象编程中,您可能需要初始化在父类中声明的受保护成员来自子类的构造函数。这是一个常见的场景,但问题出现了:可以使用子类的初始化列表来实现吗?
让我们考虑以下示例:
<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中文网其他相关文章!