ホームページ > バックエンド開発 > C++ > 仮想基底クラスのデフォルトのコンストラクターが仮想継承階層で呼び出されるのはなぜですか?

仮想基底クラスのデフォルトのコンストラクターが仮想継承階層で呼び出されるのはなぜですか?

Linda Hamilton
リリース: 2024-11-16 15:25:03
オリジナル
736 人が閲覧しました

Why is the default constructor of the virtual base class called in a virtual inheritance hierarchy?

仮想継承とデフォルト コンストラクターの呼び出し

仮想継承を含む継承階層では、仮想基本クラスのデフォルト コンストラクターが予期せず呼び出される可能性があります。 。次のコードを考えてみましょう。

class grandmother {
public:
    grandmother() { // Default constructor
        std::cout << "grandmother (default)" << std::endl;
    }
    grandmother(int attr) { // Parameterized constructor
        std::cout << "grandmother: " << attr << std::endl;
    }
};

class mother: virtual public grandmother {
public:
    mother(int attr) : grandmother(attr) {
        std::cout << "mother: " << attr << std::endl;
    }
};

class daughter: virtual public mother {
public:
    daughter(int attr) : mother(attr) {
        std::cout << "daughter: " << attr << std::endl;
    }
};

int main() {
  daughter x(0);
}
ログイン後にコピー

娘クラスのインスタンスが作成されると、出力は次のようになります。

grandmother (default)
mother: 0
daughter: 0
ログイン後にコピー

祖母クラスにパラメータ化されたコンストラクターが存在するにもかかわらず、デフォルトのコンストラクターが呼び出されます。なぜこのようなことが起こるのでしょうか?

仮想基本クラス コンストラクターの呼び出し

仮想継承では、仮想基本クラスのコンストラクターは、最も派生したクラスのコンストラクターによって直接呼び出されます。この場合、娘コンストラクターは祖母コンストラクターを直接呼び出します。

母クラスは初期化リストで祖母コンストラクターを明示的に呼び出していないため、デフォルトのコンストラクターが使用されます。目的のコンストラクターを正しく呼び出すには、娘コンストラクターを次のように変更する必要があります。

daughter(int attr) : grandmother(attr), mother(attr) { ... }
ログイン後にコピー

初期化リストで祖母(attr) コンストラクターを明示的に呼び出すことで、正しいコンストラクターが使用され、出力は次のようになります。

grandmother: 0
mother: 0
daughter: 0
ログイン後にコピー

以上が仮想基底クラスのデフォルトのコンストラクターが仮想継承階層で呼び出されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート