我有两个类: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
}
答案 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();
}