抽象クラスについての疑問なのですが
実験で以下のようなクラスを作ってみました。
class A
{
public:
virtual void func() = 0;
};
class B
{
public:
virtual int func() = 0;
};
class C : public A, public B
{
public:
void func() {}
int func() {}
};
抽象クラスA, Bには戻り値だけが異なる同名メンバ関数があり
A, Bを多重継承したクラスCで実装しようとしてるところです。
ところが以下のエラーが出ます
error C2555: 'C::func' : オーバーロードする仮想関数と 'B::func' の違いは戻り値の型で
す。
error C2556: 'int __thiscall C::func(void)' : オーバーロード関数の戻り値は異なっていま
すが、引数リストは同一です。
error C2371: 'func' : 再定義されています。異なる基本型です。'func' の宣言を確認して
ください。
以下C2143構文エラー
戻り値の違いだけではA, Bどちらのfuncか区別できないからだと思うのですが
こういう場合はどう書いたらよいのでしょうか?
もしかしてこういう構成は不可能なのでしょうか?
はい、不可能です。
返却値だけ異なり引数リストが同一である関数は多重定義できません。
あの後ふと思いついて以下のようにしてみたらできました。
最初のようにCだけでA::func, B::funcを実装できないのは不便ですが
解決としておきます。
ありがとうございました。
class A
{
public:
virtual void func() = 0;
};
class B
{
public:
virtual int func() = 0;
};
class AA : public A
{
public:
void func() { printf(A\n); }
};
class BB : public B
{
public:
int func() { printf(B\n); return 0; }
};
class C : public AA, public BB
{
};
C c;
A* pa = &c;
B* pb = &c;
pa->func(); // Aと表示
pb->func(); // Bと表示