[解決済み] 仮想継承でDefaultコンストラクタが呼ばれるのはなぜですか?
2023-06-03 14:15:25
疑問点
以下のコードにおいて、なぜ
daughter
型のオブジェクトをインスタンス化すると、デフォルトの
grandmother()
のコンストラクタが呼び出されます?
のどちらかが
grandmother(int)
コンストラクタを呼び出す必要があります (私の
mother
のコンストラクタを呼び出すか、仮想継承のためにこのコードは全くコンパイルされないはずです。
ここではコンパイラは無言で
grandmother
のデフォルトコンストラクタを呼び出しています。
#include <iostream>
class grandmother {
public:
grandmother() {
std::cout << "grandmother (default)" << std::endl;
}
grandmother(int attr) {
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);
}
どのように解決するのですか?
仮想継承を使用する場合、仮想基底クラスのコンストラクタは、最も派生したクラスのコンストラクタから直接呼び出されます。この場合
daughter
のコンストラクタは直接
grandmother
コンストラクタを呼び出します。
を明示的に呼び出したわけではないので
grandmother
を明示的に呼んでいないので、デフォルトのコンストラクタが呼び出されます。正しいコンストラクタを呼び出すには、次のように変更します。
daugther(int attr) : grandmother(attr), mother(attr) { ... }
参照 このFAQのエントリ .
関連
-
[解決済み】coutはstdのメンバではない
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。