4

多重継承をテストするために、ここからポリモーフィズムの例を変更しています。次のコードを実行すると、コンソールに奇妙な値「15794192」が出力され、結果として20が期待されます。なにが問題ですか?ご意見ありがとうございます。

多重継承の問題によって引き起こされるエラーを回避しようとしましたが、ビルドエラーが発生しないこのコードを考え出しました。私が議論している問題は多重継承に根ざしていないかもしれませんが、私はまだ確信がありません。引用されたWebページの元の例は、言うまでもなくうまく機能します。

(環境)Ubuntu 12.04、cmake2.8.7はEclipseIndigoで実行されます

#include <iostream>
using namespace std;

class CPolygon //: public CShape
{
protected:
  int width, height;
public:
  void set_values(int a, int b)
  {
    width = a;
    height = b;
  }
  virtual int area(void) =0;
  void printarea(void)
  {
    cout << this->area() << endl;
  }
};

class CustomPolygon : public CPolygon
{
public:
  int customParam;
  void printarea(void)
  {
    this->CPolygon::printarea();
  }
};

class Rectangle : public CPolygon // This class should be concrete.
{
public:
  int area(void)
  {
    return (width * height);
  }
  void printarea(void)
  {
    this->CPolygon::printarea();
  }
};

class CustomSquare : public CustomPolygon, Rectangle  // Concrete class
{
public:
  int area()
  {
    this->Rectangle::area();
  }
  void printarea(void)
  {
    this->Rectangle::printarea();
  }
  void set_values(int a, int b)
  {
    this->Rectangle::set_values(a, b);
  }
};

int main()
{
  CustomSquare *cs = new CustomSquare();
  cs->CustomSquare::set_values(4, 5);
  cs->CustomSquare::printarea();
  return 0;
}

(更新8/14/12)アドバイスのおかげで、を使用して、使用するスーパークラスの関数を明示的に宣言することを回避できるようになりましたvirtual inheritance。更新されたコードはここにあります:

#include <iostream>
using namespace std;

class CPolygon
{
protected:
  int width, height;
public:
  void set_values(int a, int b)
  {
    width = a;
    height = b;
  }
  virtual int area(void) =0;
  void printarea(void)
  {
    cout << this->area() << endl;
  }
};

class CustomPolygon : virtual public CPolygon
{
public:
  int customParam;
};

class Rectangle : virtual public CPolygon
{
public:
  int area(void)
  {
    return (width * height);
  }
};

class CustomSquare : public CustomPolygon, Rectangle
{
};

int main()
{
  CustomSquare *cs = new CustomSquare();
  cs->CustomSquare::set_values(4, 5);
  cs->CustomSquare::printarea();
  return 0;
}
4

2 に答える 2

10

CustomSquare::area()メソッドから何かを返す必要があります。

int area()
{
  return this->Rectangle::area();
}

ダイヤモンド継承の場合があるため、仮想継承の使用も検討する必要があります。

class CustomPolygon : virtual public CPolygon {};

class Rectangle : virtual public CPolygon {};
于 2012-08-14T16:54:12.093 に答える
6

の関数areaではCustomSquare、値を返しません。

私はEclipseに精通していませんが、そのような状況で警告を有効にする方法があると確信しています。
g ++では、-Wreturn-typeスイッチ、または-Wall

于 2012-08-14T16:57:04.280 に答える