電子書籍の厳選無料作品が豊富!

こんにちは。
質問させてください。

以下のようなコードがあったとします。

class Base1
{
public:
  virtual int get()=0;
};

class Base2
{
public:
  virtual float get()=0;
};

class Ex : public Base1, public Base2
{
public:
  int get(){return 0;}
  float get(){return 0.0f;}
};

void main()
{
}

このプログラムをコンパイルすると
「'Ex::get': オーバーライドする仮想関数の戻り値の型が異なり、'Base1::get' の covariant ではありません。」
というエラーが出てしまいます。

関数の名前と引数が同じで戻り値だけが異なる場合はエラーが出るのはわかるのですが、基底クラスのBase1、Base2は変更不可能だとするとどのように回避すればいいのでしょうか?
よろしくお願いします。

/*
  WindowsXP Professional SP3
  VisualStudio2005 AcademicEdition
*/

A 回答 (1件)

 二つの抽象クラスを多重継承し、かつそれらの同名の純粋仮想関数をオーバーライドすることについて、オブジェクト指向的にどのような意味があるのか不明ですが、単にコンパイルを通したいだけであれば、スコープ解決演算子を使用する方法が考えられます。



class Base1 {
 public:
  virtual int get() = 0;
};

class Base2 {
 public:
  virtual float get() = 0;
};

class Ex: public Base1, public Base2 {
 public:
  int get(int ) {
    Base1::get();
    return 0;
 }

 float get(float ) {
    Base2::get();
    return 0.0f;
 }
};

int main()
{
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

上記の方法でコードを書いてみたところ、確かにコンパイルは通るのですが実態化することができませんでした。

しかし、
>>二つの抽象クラスを多重継承し、かつそれらの同名の純粋仮想関数をオーバーライドすることについて、オブジェクト指向的にどのような意味があるのか不明ですが

という発言を受けて少し考えてみて、現在の自分の設計のしかたのまずいところが見つかった気がします。

ありがとうございました。

お礼日時:2009/04/18 00:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!