継承を仮想に変更して、ダイヤモンドの継承を解決しました。
残念ながら、それは私のコンストラクターを壊します。それ以外の場合は、ダイヤモンドの継承が問題になります。
ダイヤモンドの片側:
TModuleBase -> TServerModuleBase -> MyModule
MyClass は基本クラスを継承します
class MyModule :
public TServerModuleBase
{
...
}
MyModule::MyModule()
: TServerModuleBase(ModuleName())
{
}
QString MyModule::ModuleName(void)
{
return "MyModuleName";
}
TModuleBase と TServerMosuleBase には 2 つの可能なコンストラクタがあるため (違い: サーバーは公開されていませんが、保護されています)。
class TModuleBase
{
public:
explicit TModuleBase(void);
explicit TModuleBase(QString moduleName);
}
class TServerModuleBase
: public virtual TModuleBase
{
protected:
explicit TServerModuleBase(void);
explicit TServerModuleBase(QString moduleName);
}
TServerModuleBase::TServerModuleBase(void)
: TModuleBase()
{
}
TServerModuleBase::TServerModuleBase(QString moduleName)
: TModuleBase(moduleName)
{
}
MyModule コンストラクターが呼び出されると、無効なコンストラクターが呼び出されます。
TServerModuleBase(ModuleName()) //expected
TServerModuleBase() //called
チェンジバックするとき
class TServerModuleBase
: public virtual TModuleBase
の中へ:
class TServerModuleBase
: public TModuleBase
コンストラクターの選択は期待どおりに機能します。
g++ を使用しています。はい、クリーンビルドを行いました。何度も。
あなたの注意、時間、そして助けてくれてありがとう。