使用virtual重写基类方法不起作用

时间:2013-10-11 04:20:41

标签: c++ class oop inheritance override

我有两个类:ShapeTwoD&方

Square来自ShapeTwoD

Class 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};

 };

在我的main方法中,我试图调用方法computeArea()的Square版本,而不是调用方法computeArea()的ShapeTwoD版本。我在网上看到,使用关键字虚拟将允许动态确定方法,因此允许我调用方法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
 }

1 个答案:

答案 0 :(得分: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();
}