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

Posted

技术标签:

【中文标题】将参数传递给超类构造函数【英文标题】:Passing arguments to a superclass constructor 【发布时间】:2013-05-10 04:48:47 【问题描述】:

我刚刚进入派生类,我正在研究著名的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",在每个派生构造函数中。

【问题讨论】:

对于您的编译器错误,您必须删除冒号后Shape(double w, double h) 中的doubles,因为您实际上是在调用基类的构造函数。 另外,考虑使用成员初始化器来初始化 Shape 的成员,而不是赋值,即让 Shape 构造函数看起来像这样:Shape(double w = 0, ...) : width(w), height(h), radius(r) 通用形状的半径是什么意思?也许你需要重新考虑你的班级设计。 【参考方案1】:

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

另外,你不必在派生类的构造函数体中设置widthheight

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

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

创建派生对象时,会执行以下操作:

    Shape 的内存已预留 调用适当的 Base 构造函数 初始化列表初始化变量 构造函数的主体执行 控制权返回给调用者

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

【讨论】:

Shape 构造函数的主体?那它可以是空的吗? @user2302335 我的意思是 Rectangle 构造函数的主体。【参考方案2】:

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

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

您应该简单地“通过它们”(给出不准确的措辞):

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

【讨论】:

以上是关于将参数传递给超类构造函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将构造函数参数传递给 AppDomain.CreateInstanceXXX?

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

我如何将参数传递给构造函数? [关闭]

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

.NET Core DI,将参数传递给构造函数的方法

Web3 + Solidity:将参数传递给合约的构造函数