ホームページ  >  記事  >  バックエンド開発  >  保護された親メンバーは子の初期化リストを使用して初期化できますか?

保護された親メンバーは子の初期化リストを使用して初期化できますか?

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' という名前のフィールドがありません」というエラーを報告します。このエラーは、コンパイラが子クラス内の 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。