内部および外部で使用するためのAPIを開発しています。VisualStudio10の場合。
仮想基本クラスIAと派生仮想基本クラスIBがあります。私はクラスAでIAを実装し、次にBからIBの具体的な実装を導き出します。これは私の理解では古典的なダイヤモンド問題です。したがって、IAの継承を仮想にし、AのBの継承についても同じにします。しかし、警告c4250が表示されます。(warning C4250: 'B' : inherits 'A::A::AnInt' via dominance)
- この警告は、コンパイラが私が望むことを実行していることを示すために継ぎ目がありますが、警告に不快感を覚え、#pragmaを安全に実行できることを確認したかったのですが、気づいていない問題がありました。
コード
class IA
{
public:
virtual int AnInt() = 0;
};
class A : virtual public IA
{
public:
virtual int AnInt()
{
return 3;
}
};
class IB : virtual public IA
{
public:
virtual int AnInt2() = 0;
};
class B : public A, public IB
{
public:
int AnInt2()
{
return 4;
}
};
質問の2番目の部分。消費する開発者が問題の抽象クラスを変更できないAPIを作成している場合。継承を使用したインターフェイスの設計を回避するか、先に進んで派生クラスに仮想継承を利用させる必要があります。