【问题标题】:Problem with C++ Constructor. What exactly is getting initialized here?C++ 构造函数的问题。这里到底初始化了什么?
【发布时间】:2020-07-22 08:50:19
【问题描述】:
#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;
}

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

由于访问说明符是公开的,因此速度不会被继承。由于 Car 中没有 speed 成员,5 被分配到什么位置?

【问题讨论】:

  • “由于访问说明符是公开的,所以速度不会被继承”...什么?我建议您阅读更多关于继承的内容,派生类包含其基类的所有成员
  • 私有属性永远不会被继承。据我所知
  • 他们肯定是遗传的。但是,您不能从派生类访问它们。
  • private vs protected 指定访问成员,但不禁止他们存在
  • @jamesgem 私有成员是继承的,除非你是声明它们的类的朋友,否则你不能引用它们。

标签: c++ inheritance constructor public


【解决方案1】:

类 Car 是从 Vehicle 派生的。当您创建 Car 类的对象时,它还包含 Vehicle 的内存。这意味着 Car 类的对象有 Vehicle 作为成员。 希望this link能给予很好的理解。

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

 Car() : Vehicle(5)

这是一种初始化 Vehicle 类成员的方法。 有Initializer List in C++的概念,在更好用的时候可以read here

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

【讨论】:

    【解决方案2】:

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

    在公共访问说明符下将此函数添加到您的类Vehicle

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

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

    Car a; a.display();
    

    它将输出5,这是您在派生类Car中从基类Vehicle初始化的变量speed的值。

    由于访问说明符是公开的,因此速度不会被继承。

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

    由于 Car 中没有 speed 成员,5 被分配到什么位置?

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

    【讨论】:

      【解决方案3】:

      由于访问说明符是公开的,因此速度不会被继承。

      这是一个误解。派生类确实继承了基类的所有成员。访问说明符控制的只是继承的类是否可以访问成员。 Car 不能直接访问speed,但该成员在那里。

      请记住,公共继承对“is-a”关系进行建模。 CarVehicle。如果Car 没有speed 成员,它就不是Vehicle

      【讨论】:

      • 知道了。非常感谢
      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2021-06-30
      • 1970-01-01
      相关资源
      最近更新 更多