类层次结构C ++

时间:2016-04-28 19:55:08

标签: c++ class polymorphism class-hierarchy

所以,我对某事有疑问。当我尝试使用currentCirclestring的参数创建一个名为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;
};

1 个答案:

答案 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;
}