首页 > 解决方案 > 虚拟类 C++ 和继承

问题描述

为什么我不能从 Rectangle 创建对象?

我知道:

Shape *p;
p = new Rectangle(10,5);

会工作,但我不明白为什么我不能像下面这样创建:

Shape *p;
Rectangle rec;  
p = &rec;

p->shapeName();

我得到的错误是这样的:

调用 'Rectangle::Rectangle()' 没有匹配的函数

这是我的最小示例:

#include <iostream>

using namespace std;

class Shape {
protected:
    double area, perimeter;

public:
    virtual void shapeName() = 0;
    virtual void shapeArea() = 0;
    virtual void shapePerimeter() = 0;

    double getArea()
    {
        return area;
    }

    double getPerimeter()
    {
        return perimeter;
    }
};

class Rectangle : public Shape {
    double height, width;

public:
    Rectangle(double height, double width)
        : height(height)
        , width(width)
    {
    }

    void shapeName()
    {
        cout << "Rectangle" << endl;
    }
    void shapeArea()
    {
        area = height * width;
    }
    void shapePerimeter()
    {
        perimeter = 2 * (height + width);
    }
};

int main()
{

    Shape* p;
    Rectangle rec;
    p = &rec;

    p->shapeName();
}

标签: c++objectvirtualshapes

解决方案


你错过了矩形参数:

Rectangle rec(10, 5);  
Shape *p = &rec;

p->shapeName();

以同样的方式

p = new Rectangle(); // Won't work: No default constructor.

推荐阅读