0

基本クラスと子クラスの関数の継承について非常に混乱しています。私はそれらのクラスを持っています:

#include <point.h>

class Polygon{
public:
    Polygon();
    virtual ~Polygon();
    void addPoint(Point *p);
    std::string getType();
    Point* getPoint(int index);
    int getNumOfPoints();
    int getColor();
    virtual int area()=0;

private:
  std::vector<Point*> _points;

  int color;
  std::string type = "Polygon";

};

class Rectangle : public Polygon{
public:
    Rectangle();
    virtual ~Rectangle();
    virtual int area();

private:
    std::vector<Point*> _points;

    int color;
    std::string type = "Rectangle";
};

さて、主に私はこれを行います:

Rectangle rect();
rect.getType();

これにより「ポリゴン」が得られますが、「長方形」が必要です。継承と混同していると確信しています。したがって、私の理解によると、基本クラスの関数は継承されますが、関数を実行すると、実際のオブジェクト (Rectangle) ではなく、オブジェクトの基本クラスのメンバーに関連するのはなぜですか?

誰かが助けてくれたら嬉しいです!とても有難い

4

3 に答える 3

2

Rectangle::typeはまったく関係のないことPolygon::typeです。たまたま同じ名前を持つ別のデータ メンバーです。

目的の効果を実現する 1 つの方法は、getType()virtual を作成し、すべての派生クラスでそれをオーバーライドすることです。

class Polygon {
public:
    virtual std::string getType() = 0;
    ...
}

class Rectangle: public Polygon {
public:
    virtual std::string getType();
    ...
}

std::string Rectangle::getType() {
    return "Rectangle";
}
于 2012-11-25T19:56:30.880 に答える
0

typeのインスタンスで名前が付けられた 2 つのメンバがありますRectangle。のプライベート メンバーはPolygon、そのクラスのメンバー関数からのみアクセスできるため、Rectangle. Rectangleでは、のtypeメンバーにアクセスできないため、適切なシャドーイングでPolygonはありません。Soは、 で定義された関連のないものではなく、 で定義されたものをPolygon::getType返します。typePolygonRectangle

問題を解決するには、いくつかの方法があります。

  • typeで保護されたメンバーとして定義しPolygon、すべてのコンストラクターでそれに割り当てます。
  • ドロップtype; virtual として宣言getTypeし、すべてのクラスでそれをオーバーライドして、定数文字列を返します。
  • オブジェクトの実際のクラスを見つけるために RTTI を使用します。
  • オブジェクトの正確な型を伝える必要がないようにプログラムを設計してください。通常はこれが最適です。の異なるサブクラスに対して異なる動作が必要になるたびにPolygon、特定の動作を実装する仮想メンバー関数を記述します。
于 2012-11-25T20:01:16.500 に答える
0

タイプ文字列が必要なのは、基本クラスの 1 か所だけです。派生クラスでアクセスできるようにするが、ユーザーにはアクセスできないようにするため、保護します。各コンストラクターで、適切な値に設定します。

Polygon::Polygon():
        type("polygon")
{}

Rectangle::Rectangle()
    Polygon()
{
    type = "rectangle";
}
于 2012-11-25T20:03:52.377 に答える