У меня есть 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(), вместо этого я продолжаю вызывать версию ShapeTwoD метода computeArea(). Я читал онлайн, что размещение ключевого слова virtual позволило бы определить метод динамически, следовательно, позвольте мне вызвать квадратную версию метода computeArea()
Почему это происходит и как я называю квадратные версии метода computeArea()
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
}
Эта работа и возвращение 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
возникает после фазы префикса -c (также #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();
}