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

时间:2013-05-10 04:48:48

标签: c++ class inheritance constructor

我刚刚进入派生类,我正在着名的Shape课程。 Shape是基类,然后我有三个派生类:CircleRectangleSquareSquareRectangle的派生类。我想我需要将派生类构造函数中的参数传递给基类构造函数,但我不确定如何做到这一点。我想在创建它们时设置形状的尺寸。以下是我对基类和一个派生类的看法:

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"

2 个答案:

答案 0 :(得分:3)

您必须将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. 控制权返回给来电者
  6. 在您的示例中,Shape子对象由Shape(double w = 0, double h = 0, double r = 0)初始化。在此过程中,基础部分(widthheightradius)的所有成员都由基础构造函数初始化。在那之后,派生构造函数的主体被执行,但是你不必在这里改变任何东西,因为它们都是由基础构造函数处理的。

答案 1 :(得分:0)

几乎。而不是在这里重新声明参数:

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

你应该简单地“传递它们”(给出不准确的措辞):

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