0

我有 2 节课:ShapeTwoD 和 Square

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将允许动态确定方法,因此允许我调用方法 computeArea() 的 Square 版本

为什么会发生这种情况以及如何调用方法 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 回答