C++ 构造函数的问题。这里究竟初始化了什么?

Problem with C++ Constructor. What exactly is getting initialized here?

#include<bits/stdc++.h>
using namespace std;


class Vehicle
{
private:
int speed;

public:
Vehicle(int x)
{
   speed=x;
   cout << "Vehicle's parametrized constructor called" << endl;
}
};

class Car : public Vehicle
{ 
   public:
   Car() : Vehicle(5)
   {
        cout << "Car's constructor called" << endl;
   }
};

int main()
{
    Car a;
}

输出- 车辆的参数化构造函数调用
汽车的构造函数称为

由于访问说明符是public,因此速度不会被继承。 Car中没有速度成员,5分配给什么?

Since the access specifier is public, speed is not inherited.

这是误会。派生 class 确实继承了基础 class 的所有成员。访问说明符控制的只是被继承的class是否可以访问成员。 Car 无法直接访问 speed 但成员在那里。

请记住,public 继承为 "is-a" 关系建模。 CarVehicle。如果 Car 没有 speed 成员,它就不会是 Vehicle

您可以使用显示功能自行测试。

将此函数添加到 class Vehicle 下的 public 访问说明符:

void display() { std::cout<<speed; }

现在从 class Car 派生的一个对象,在 main() 中调用这个函数:

Car a; a.display();

它会输出5,这是你在derivedclassCar中初始化的变量speed的值,from baseclassVehicle.

Since the access specifier is public, speed is not inherited.

无论强加的访问说明符如何,所有变量都是继承的。不同之处在于它们不能直接访问。对于像 speed 这样的 private 成员,您需要通过 public 成员函数访问它们,就像我在上面所做的那样。

What does 5 get assigned to as there is no speed member in Car?

它被分配给 Car 对象中的派生变量 speed

Class Car 派生自 Vehicle。当您创建 class Car 的对象时,它还包含 Vehicle 的内存。这意味着 class Car 的对象有 Vehicle 作为成员。 希望this link大家多多理解

当您创建 Car 的对象时,它会调用 class Car 的构造函数,该构造函数在执行 Car 构造函数的主体之前在内部调用 class Vehicle 的构造函数。

 Car() : Vehicle(5)

这是一种初始化 Vehicle class 成员的方法。 有一个Initializer List in C++ and you can read here的概念,什么时候用比较好

Value 5 被传递给 Vehicle 的构造函数并最终存储在 class 成员 speed 中。在您的代码中,如果您打印 speed,您会看到,无论您传递的是什么值,都会存储在那里。