c++ - 子类构造器

标签 c++ inheritance

我在使用 C++ 中的子类时遇到问题。我有一个多边形类和一个三角形子类。我希望能够通过传递一个 Point* vector (这是一个自定义类)来声明一个多边形,并通过传递三个 Point* 来声明一个三角形。

我的理解是Triangle类的构造函数应该调用Polygon类的构造函数。

这是我目前所拥有的:

class Polygon
{
public:
    vector<Point*> pts;
    Polygon(vector<Point*> aPts) : pts(aPts) {};
};
class Triangle : public Polygon
{
public:
    Triangle(Point* A, Point* B, Point* C) 
    {
        vector<Point*> APts;
        APts.push_back(A); APts.push_back(B); APts.push_back(C);
        Polygon(APts);
    }
};

但是,在 Triangle 构造函数的左括号中出现错误:

error: no matching function call to 'Polygon::Polygon()'

有人可以帮忙吗?

最佳答案

基类必须在派生类的构造函数体之前被初始化;如果构造函数需要参数,则必须在初始化列表中提供这些参数:

Triangle(Point* A, Point* B, Point* C) :
    Polygon({A,B,C})
{}

请注意,这使用 C++11 语法来创建临时 vector ;如果你还停留在过去,那就有点复杂了:

static std::vector<Point*> make_points(Point* A, Point* B, Point* C) {
    std::vector<Point*> points;
    points.push_back(A);
    points.push_back(B);
    points.push_back(C);
}

Triangle(Point* A, Point* B, Point* C) :
    Polygon(make_points(A,B,C))
{}

或者为基类提供默认构造函数可能更容易(但可能更容易出错),然后在派生类构造函数中填充 vector :

// In Polygon
Polygon() {} // constructed with no points
// pts must be "public" or "protected"

// In Triangle
Triangle(Point* A, Point* B, Point* C) {
    pts.push_back(A);
    pts.push_back(B);
    pts.push_back(C);
}

关于c++ - 子类构造器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034422/

相关文章:

c++ - 为什么可变参数模板函数会得到 "no matching function for call to .."?

Javascript "OOP"和具有多级继承的原型(prototype)

inheritance - 在dart中找到所有子类

c++ - 没有额外数据成员的继承

c++ - 为类元素定义字典比较的最简单方法是什么?

c++ - 如何在单元测试中测试 boost 记录器输出?

c++ - Qt - 如何在线程中从串口读取数据

C++:初始化成员 Vector 值

python - 是否可以从作为参数给出的类继承?

unit-testing - 对(超过?)扩展使用服务的基类的 Grails 域进行单元测试