将参数传递给超类构造函数

Passing arguments to a superclass constructor

本文关键字:构造函数 超类 参数传递      更新时间:2023-10-16

我正在研究派生类,我正在研究著名的Shape类。Shape是基类,然后我有三个派生类:Circle, RectangleSquareSquareRectangle的派生类。我认为我需要从派生类构造函数传递参数到基类构造函数,但我不确定究竟如何做到这一点。我想为我创建的形状设置尺寸。下面是基类和一个派生类的内容:

Shape(double w = 0, double h = 0, double r = 0)
{
     width = w;
     height = h;
     radius = r;
}

class Rectangle : public Shape
{
     public:
     Rectangle(double w, double h) : Shape(double w, double h)
     {
         width = w;
         height = h;
     }              
     double area();
     void display();      
};

我讲对了吗?我得到以下编译器错误:expected primary expression before "double",在每个派生的构造函数。

您必须将Shape(double w, double h)更改为Shape(w, h)。你实际上是在调用基构造函数。

此外,您不必在派生类的构造函数体中设置widthheight:

  Rectangle(double w, double h) : Shape(w, h)
  {}

就足够了。这是因为在初始化列表中,Shape(w, h)将调用基类的构造函数(shape),它将为您设置这些值。

创建派生对象时,将执行以下语句:

  1. Shape预留内存
  2. 相应的Base构造函数被称为
  3. 初始化列表初始化变量
  4. 构造函数体执行
  5. 控制权返回给调用者

在您的示例中,Shape子对象由Shape(double w = 0, double h = 0, double r = 0)初始化。在这个过程中,基类部分(width, height, radius)的所有成员都由基类构造函数初始化。之后,执行派生构造函数的主体,但这里不需要更改任何内容,因为所有这些都由基构造函数处理。

差不多了。而不是在这里重新声明参数:

Rectangle(double w, double h) : Shape(double w, double h)

你应该简单地"pass them through"(给一个不准确的措辞):

Rectangle(double w, double h) : Shape(w, h)
{ }