C++构造函数与派生对象

C++构造函数与派生对象,c++,class,constructor,C++,Class,Constructor,我得到了这个代码,不知道为什么在课堂上会这样 Cylinder(double r, double h) : base (r), height(h) {} 不是 Cylinder(double r, double h) : base.radius (r), height(h) {} 我的意思是一个替身正在被移交,基地是一个圆柱体,它不应该是基地半径吗 // member initialization #include <iostream> using namespace std;

我得到了这个代码,不知道为什么在课堂上会这样

Cylinder(double r, double h) : base (r), height(h) {}
不是

Cylinder(double r, double h) : base.radius (r), height(h) {}
我的意思是一个替身正在被移交,基地是一个圆柱体,它不应该是基地半径吗

// member initialization
#include <iostream>
using namespace std;

class Circle {
    double radius;
  public:
    Circle(double r) : radius(r) { }
    double area() {return radius*radius*3.14159265;}
};

class Cylinder {
    Circle base;
    double height;
  public:
    Cylinder(double r, double h) : base (r), height(h) {}
    double volume() {return base.area() * height;}
};

int main () {
  Cylinder foo (10,20);

  cout << "foo's volume: " << foo.volume() << '\n';
  return 0;
}
我得到了这个代码,不知道为什么在课堂上会这样

Cylinder(double r, double h) : base (r), height(h) {} 
不是

Cylinder(double r, double h) : base.radius (r), height(h) {}
调用base.radius r无效,因为它是Circle的私有成员。 即使它不是私有的,您也不能在初始值设定项列表中的构造期间访问它。
不过,使用圆构造函数初始化radius非常好。

首先,代码中没有继承。其次,当您调用圆柱体构造函数时,其成员将被构造。由于Circle没有默认构造函数,您必须确保在构造圆柱体的过程中调用圆的构造函数。如果你有

Cylinder(double r, double h) : height(h) {}
编译器会抱怨缺少Circle的默认构造函数,因为如果不显式调用构造函数,则会使用

Circle::Circle()
它不存在,因为Circle声明了不同的构造函数。也

Cylinder(double r, double h) : base.radius (r), height(h) {}
无法工作,因为radius在Circle中是私有的,因为您只能初始化初始值设定项列表中圆柱体的成员,即使基类的成员也是不允许的。

首先,这里的名称base非常非常糟糕;您的圆对象不是基准

而且,不,类不能直接初始化其成员的成员或实基的成员。这将是一场利益冲突,一场责任的混乱,一场情感的大火

类提供了一个用于管理它的接口,该接口由函数组成,而不是直接访问成员。如果你在不让它知道的情况下进入并更改了圆圈的数据,那将是多么令人困惑

您使用其构造函数初始化对象,并让该构造函数执行它认为正确的操作。在这种情况下,构造函数确实会按照您的意愿设置radius成员


阅读。

没有继承或派生对象?实际上没有,因为您需要调用基类的唯一构造函数!你是不是被命名基搞糊涂了?你是不是在考虑C中的基关键字?它不存在于C++中。为什么回滚我的编辑?如前所述,没有衍生涉及!再次投反对票,让你的问题变得不清楚。隐私不是唯一的原因。将半径设置为受保护的,甚至是公开的,您将看到。@BoundaryPosition是的,您是对的。我提到了,没有更好的措辞。圆柱体的顶部和底部都有底座,因此命名。从几何角度来看,命名很好。@πάνταῥεῖ: 在C++程序中,这仍然是一个可怕的选择。第二句话,当你调用圆柱体构造函数时,它的成员就被构造了。让我明白:=