2026年6月7日日曜日

cppで継承する複数のクラスが参照する先祖クラスを扱いたい場合は先祖継承時にvirtual宣言すると良い


背景

cppで親クラスが共有する先祖(祖父母)クラスの継承時のエラー解消に戸惑ったので、対応方法を記事に残します。

共有する先祖クラスをvirtualで継承

下記のように親クラスでの先祖クラス継承時にvirtualを付与すればambiguosエラーを回避して実行できます。
class ParentA : virtual public GrandParent {};
class ParentB : virtual public GrandParent {};

動くコード全体を示すとこうです。
#include <iostream>

class GrandParent {
public:
int fnGrandParent() { return 99; }
};

class ParentA : virtual public GrandParent {};

class ParentB : virtual public GrandParent {};

class Bundled : public ParentA, public ParentB {};

int main(int argc, char** argv) {
Bundled bundled;
printf("fnGrandParent(): %d\n", bundled.fnGrandParent());
}

実行すると期待通りにanbiguosエラーを回避しつつ先祖クラスの実装内容を受け取れました。
fnGrandParent(): 99

動作環境

g++: (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0
(gccコマンドでは undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info' というエラーが発生してビルド不能だったので、g++を使うのが良いです。)

おわり

クラスの参照重複の解決方法が分かって良かったです。

参考

Under multiple inheritance, what happens if the same member name appears in two different base classes?
上記記事に対するAadhithya Sankar氏の回答

0 件のコメント :