子の初期化リストを使用した保護された親メンバーの初期化
オブジェクト指向プログラミングでは、親クラスで宣言された保護されたメンバーを初期化する必要がある場合があります。子クラスのコンストラクターから。これは一般的なシナリオですが、次のような疑問が生じます: これは子クラスの初期化リストを使用して実現できますか?
次の例を考えてみましょう:
<code class="cpp">class Parent { protected: std::string something; }; class Child : public Parent { private: Child() : something("Hello, World!") {} };</code>
このコードをコンパイルしようとすると、コンパイラは、「クラス 'Child' には 'something' という名前のフィールドがありません」というエラーを報告します。このエラーは、コンパイラが子クラス内の some メンバーを見つけられないことを示します。
ここでの問題は、子クラスの初期化リスト (: 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 中国語 Web サイトの他の関連記事を参照してください。