0

私は2つのクラスを持っています: ShapeTwoD & Square

正方形は ShapeTwoD から派生します

クラス ShapeTwoD

class ShapeTwoD
{
public:
ShapeTwoD();
ShapeTwoD(string,bool);

string getName();
void setName(string);

bool getContainsWarpSpace();
void setContainsWarpSpace(bool);

void toString();

virtual double computeArea(){return 2+3.0};

virtual bool isPointInShape(int,int);
virtual bool isPointOnShape(int,int);



private:
string name;
bool containsWarpSpace;


};

クラススクエア

   #include "ShapeTwoD.h"
  class Square:public ShapeTwoD
 {
 public:
 virtual double computeArea(){return 2+4.0};

 };

私のメインメソッドでは、メソッドcomputeArea()のSquareバージョンを呼び出そうとしていますが、代わりにメソッドcomputeArea()のShapeTwoDバージョンを呼び出し続けています。キーワードvirtualを配置すると、メソッドを動的に決定できるため、Square バージョンのメソッド computeArea() を呼び出すことができることをオンラインで読みました。

なぜこれが起こっているのか、メソッドcomputeArea()のSquareバージョンを呼び出すにはどうすればよいですか

 using namespace std;

 #include "Square.h"

 int main()
 {

  Square s;
  s.setName("Sponge");
  cout<<s.computeArea(); //outputs 5 when i expect it to output 6
 }
4

1 に答える 1

2

これは機能し6、私にとって期待どおりに戻ります:

class ShapeTwoD {
public:
    virtual double computeArea(){return 2+3.0;};
};

class Square:public ShapeTwoD
{
public:
    virtual double computeArea(){return 2+4.0;};    
};

両方の;前に追加する必要がありましたが、例だけを見逃していましたか? それ以外の場合は、最新のビルドを実行していない可能性があります。}computeArea

編集

ファイルは、インクルードする場所にコーディングされているかのようにインクルードされるため、インクルードは重要ではありません。

使用している場合gcc/g++(ただし、他のコンパイラにも同様のオプションがあると思います)、オプションを使用して、コンパイル前のフェーズの後にファイル-Eがどのように生成されるかを確認できます(また).c/.cpp#include

g++ -c -E test.cpp

結果は次のとおりです。

# 2 "test.cpp" 2

using namespace std;

# 1 "square.h" 1
# 1 "shapetwo.h" 1
class ShapeTwoD
{
public:
 virtual double computeArea(){return 2+3.0;};
};
# 2 "square.h" 2

class Square:public ShapeTwoD
{
public:
 virtual double computeArea(){return 2+4.0;};
};
# 6 "test.cpp" 2

int main() {
 Square s;
 cout<<s.computeArea();
}
于 2013-10-11T04:33:10.140 に答える