переопределение метода базового класса с использованием виртуального не работает

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(), вместо этого я продолжаю вызывать версию 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
 }
Теги:
class
oop
inheritance
override

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 возникает после фазы префикса -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();
}
  • 0
    У меня тоже работает - я даже выложил рабочий код на codepad: codepad.org/p5PaiKHh
  • 0
    я думаю, что это как-то связано с тем, что я включаю заголовочные файлы только разных классов

Ещё вопросы

Сообщество Overcoder
Наверх
Меню