Переполнение стека иерархии классов

Итак, у меня возник вопрос о чем-то. При попытке создать объект 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;
}

-2

Решение

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.
}
0

Другие решения

Других решений пока нет …