抽象クラスの実装について – プログラミング – Home

抽象クラスの実装について
 
通知
すべてクリア

[解決済] 抽象クラスの実装について


maruo
 maruo
(@maruo)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

抽象クラスについての疑問なのですが
実験で以下のようなクラスを作ってみました。

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か区別できないからだと思うのですが
こういう場合はどう書いたらよいのでしょうか?
もしかしてこういう構成は不可能なのでしょうか?


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

はい、不可能です。
返却値だけ異なり引数リストが同一である関数は多重定義できません。


返信引用
maruo
 maruo
(@maruo)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

あの後ふと思いついて以下のようにしてみたらできました。
最初のように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と表示


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました