Итак, у меня возник вопрос о чем-то. При попытке создать объект Circle с именем currentCircle
с аргументами string
а также int
, Я сталкиваюсь с ошибкой, где он говорит мне, что не может объявить переменную currentCircle
быть абстрактного типа. Я думал, что Shape был абстрактным классом, есть ли другой способ объявить объект Circle?
#include "Shape.h"#include "Circle.h"#include "Rectangle.h"#include "Triangle.h"int main() {
// Shape circle1("blue");
Circle currentCircle("blue", 5);
cout << "Printing all shapes...\n";
currentCircle.print();
return 0;
}
Класс Shape (Абстрактный базовый класс)
class Shape {
public:
Shape() : color("") { }
Shape(const string& newColor) : color(newColor) { }
virtual ~Shape();
virtual void print() const { cout << color; }
virtual void print() = 0;
virtual double getArea() = 0;
private:
string color;
};
И класс Круга (производный класс)
#include "Shape.h"
class Circle : public Shape {
public:
Circle(const string& newColor, int newRadius);
virtual ~Circle();
double getArea();
void print() const;
private:
int radius;
};
Circle::Circle(const string& newColor, int newRadius) {
radius = newRadius;
Shape(newColor);
}
double Circle::getArea() {
return (3.14*radius*radius);
}
void Circle::print() const{
print(Shape);
cout << "circle, radius " << radius;
}
print
метод класса Circle
имеет const
квалификатор, который означает, что он не переопределяет правильный метод из Shape
— это не отменяет ничего на самом деле.
Удалить const
от print
в Circle
чтобы исправить эту проблему.
Между прочим, простой способ быстро определить это — использовать override
ключевое слово в методе производного класса, который вы хотите переопределить из базового класса. Если подписи отличаются, то компилятор выдаст вам ошибку, указывающую, что это так, например:
class A {
public:
A();
virtual void foo() const;
virtual void bar();
}
class B : A {
public:
B();
void foo() const override;
void bar() override;
void bar() const override; // would result in error, signatures do not match
}
Кроме того, следующее неверно:
void Circle::print() {
print(Shape); // Error Here
std::cout << "circle, radius " << radius;
}
Должно быть (например):
void Circle::print() {
Shape::print();
// ... etc.
}
Других решений пока нет …