传递参数给一个父类的构造(Passing arguments to a superclass con

2019-09-02 11:10发布

我刚刚进入派生类,和我的工作在著名的Shape类。 Shape是基类的话,我有三个派生类: CircleRectangleSquareSquare是一个派生类的Rectangle 。 我想我需要从派生类的构造函数的基类构造函数传递参数,但我不知道究竟是如何做到这一点。 我想设置的尺寸形状,我创建它们。 以下是我对基类和一个派生类:

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"在每一个派生的构造函数。

Answer 1:

你必须改变Shape(double w, double h)Shape(w, h) 你实际上是在这里调用基构造函数。

此外,您没有设置widthheight在派生类的构造函数体:

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

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

当创建派生对象,下面将被执行:

  1. 记忆Shape被搁置
  2. 适当的基本构造函数被调用
  3. 初始化列表初始化变量
  4. 构造函数执行的主体
  5. 控制返回给调用者

在实施例中, Shape子对象被初始化Shape(double w = 0, double h = 0, double r = 0) 在这一过程中,基体部分(全体成员widthheightradius )由基构造初始化。 在此之后,得到的构造函数的主体中执行,但你没有,因为所有的人都被基类的构造照顾到此处进行任何更改。



Answer 2:

几乎。 相反,在这里重新声明的参数:

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

您应该简单地“通过他们通过”(给一个不精确的措辞):

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


文章来源: Passing arguments to a superclass constructor