Initializing Protected Parent Members with Child's Initialization List
In object-oriented programming, you may need to initialize protected members declared in a parent class from the constructor of a child class. This is a common scenario, but the question arises: can this be achieved using the child class's initialization list?
Let's consider the following example:
<code class="cpp">class Parent { protected: std::string something; }; class Child : public Parent { private: Child() : something("Hello, World!") {} };</code>
When attempting to compile this code, the compiler reports an error: "class 'Child' does not have any field named 'something'". This error indicates that the compiler cannot locate the something member within the Child class.
The issue here lies in the inability for the child class's initialization list (: something("Hello, World!")) to access protected members of the parent class. This is because the initialization list initializes private members of the child class itself, and protected members of the parent class are not accessible from the private section of the child class.
Solution: Forwarding Constructor
To overcome this issue, you can use a forwarding constructor in the parent class to pass the initialization values to the protected member:
<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>
With this approach, the Child class's constructor calls the Parent class's constructor through the Parent("Hello, World!") syntax. This initialization passes the something parameter to the parent class's constructor, which then initializes the protected something member.
The above is the detailed content of Can Protected Parent Members be Initialized Using Child\'s Initialization List?. For more information, please follow other related articles on the PHP Chinese website!