所以,我对某事有疑问。当我尝试使用currentCircle
和string
的参数创建一个名为int
的Circle对象时,我遇到了一个错误,它告诉我它无法声明变量{{ 1}}是抽象类型。我认为Shape是抽象类,是否有不同的方式来声明Circle对象?
currentCircle
Shape类(抽象基类)
#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;
}
Circle类(派生类)
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;
};
答案 0 :(得分:0)
类print
的{{1}}方法有一个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;
}