Проблема с C ++ Конструктором. Что именно здесь инициализируется? - PullRequest
4 голосов
/ 09 апреля 2020
#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;
}

Выход - параметризованный конструктор автомобиля с именем
Конструктор автомобиля с именем

Поскольку спецификатор доступа - publi c, скорость не наследуется. На что назначается 5, так как в автомобиле нет участника скорости?

Ответы [ 3 ]

5 голосов
/ 09 апреля 2020

Поскольку спецификатор доступа - publi c, скорость не наследуется.

Это недоразумение. Производный класс наследует все члены базового класса. Что определяет спецификатор доступа, так это только то, может ли унаследованный класс получить доступ к членам. Car не может напрямую получить доступ к speed, но участник там.

Помните, что наследование publi c моделирует отношения "есть". A Car - это Vehicle. Если бы у Car не было члена speed, это не был бы Vehicle.

3 голосов
/ 09 апреля 2020

Автомобиль класса получен из автомобиля. когда вы создаете объект класса Car, он также содержит память для Vehicle. это означает, что объект класса Car имеет Vehicle в качестве члена. Надеюсь эта ссылка даст хорошее понимание.

, когда вы создаете объект Car, он вызовет конструктор класса Car, который внутренне вызовет конструктор класса Vehicle перед выполнением тела Car Конструктор.

 Car() : Vehicle(5)

Это способ инициализации членов класса Vehicle. Существует концепция Initializer List в C ++ , и вы можете прочитать здесь , когда его лучше использовать.

Значение 5 передается конструктору Vehicle и в конечном итоге сохраняется в ученик скорость . Если вы напечатаете скорость , в вашем коде вы увидите, какое бы значение вы ни передавали, оно там сохраняется.

3 голосов
/ 09 апреля 2020

Вы можете использовать функцию отображения, чтобы проверить это для себя.

Добавьте эту функцию в свой класс Vehicle в разделе publi c Спецификатор доступа:

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

Теперь из объект производного класса Car, вызовите эту функцию в main():

Car a; a.display();

Она выведет 5, что является значением переменной speed, которую вы инициализировали в производном классе Car из базового класса Vehicle.

Поскольку спецификатор доступа - publi c, скорость не наследуется.

Независимо от наложенных спецификаторов доступа все переменные наследуются. Разница в том, что они не доступны напрямую. Для private членов, таких как speed, вам необходимо получить к ним доступ с помощью функции-члена publi c, как я это делал выше.

На что назначается 5 как есть нет элемента скорости в Car?

Он присваивается производной переменной speed в объектах Car.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...