Кажется, вам не хватает ключевого слова virtual
.
Деструктор базового класса Shape также должен быть виртуальным (на случай, если вы когда-нибудь решите манипулировать любым изпроизводные объекты через указатель на базовый класс).
Функция computeArea () должна быть объявлена виртуальной, как это virtual double computeArea() { ... }
.
#include <iostream>
using namespace std;
class Shape {
public:
Shape() {
}
virtual ~Shape() {
}
void set(float BORDER, string COLOR) {
border = BORDER;
color = COLOR;
}
virtual double computeArea() {
return 0;
}
private:
float border;
string color;
};
class Circle : public Shape {
public:
Circle() {
}
virtual ~Circle() {
}
void setRadius(float RADIUS) {
radius = RADIUS;
}
virtual double computeArea() {
return 3.14 * radius * radius;
}
private:
float radius;
};
class Rectangle : public Shape {
public:
Rectangle() {
}
virtual ~Rectangle() {
}
void setWidth(float w) {
width = w;
}
void setLength(float l) {
length = l;
}
virtual double computeArea() {
return width * length;
}
private:
float width;
float length;
};
Также, если вы используете C ++11 или новее, вы можете добавить ключевое слово overrride
в конце определения функции computeArea
, например
virtual double computeArea() override {
return width * length;
}
и
virtual double computeArea() override {
return 3.14 * radius * radius;
}
в соответствующих классах.
А затем измените основную функцию следующим образом.
int main() {
Circle c;
c.setRadius(3);
Rectangle r;
r.setWidth(4);
r.setLength(5);
Shape *sh1, *sh2;
sh1 = &c;
sh2 = &r;
cout << sh1->computeArea() << endl;
cout << sh2->computeArea();
return 0;
}
РЕДАКТИРОВАТЬ: Кроме того, как уже отмечали другие, вам нужны указатели на базовый класс и не нужно копировать ваш производныйОбъекты класса к объекту базового класса.Смотрите модифицированную функцию main (), пожалуйста.