Как получить доступ к закрытому члену в базовом классе из подкласса с наследованием (C ++)

В настоящее время я занят наследованием и работаю с базовым классом Vehicle и подкласс под названием Truck, Подкласс наследуется от базового класса. Я управляю по наследству публичных членов Vehicle но не могу получить доступ к приватному участнику под названием top_speed в функции void describe() const,

Я знаю, что это можно сделать в коде (представленном ниже) для доступа из базового класса, но мне кажется, что я что-то упустил. В разделе комментариев в коде мой вопрос изложен более четко для вас.

void Truck::describe() const : Vehicle()

/*I know this is a way->    : Vehicle()
to inherit from the Vehicle class but how
can I inherit the top_speed private member of Vehicle in the
void describe() const function of the Truck class?*/

{
cout << "This is a Truck with top speed of" << top_speed <<
"and load capacity of " << load_capacity << endl;
}

Где в моем Vehicle класс это:

class Vehicle
{
private:
double top_speed;

public:
//other public members
void describe() const;
};

и в классе грузовиков это так:

class Truck: public Vehicle
{
private:
double load_capacity;
public:
//other public members
void describe() const;
};

Чтобы быть еще более ясным, я получаю эту ошибку:

error: 'double Vehicle::top_speed' is private

Что я могу сделать в void Truck::describe() const функция, чтобы исправить это?

2

Решение

Самый простой способ — использовать общедоступную функцию доступа в базовом классе, возвращающую копию текущего значения. прошлой что вы хотите сделать, это предоставить личные данные подклассам (*).

double Vehicle::getTopSpeed( void ) const {
return this->top_speed;
}

а затем используйте его в классе Truck:

void Truck::describe( void ) const {
cout << "This truck's top speed is " << this->getTopSpeed() << endl;
}

(Да, я знаю, «this->» является излишним, но он используется для иллюстрации того, что он обращается к членам / методам класса)

(*) Потому что, на самом деле, если вы собираетесь предоставлять данные членам суперкласса (ов), то зачем вам вообще использовать private / protected / public?

4

Другие решения

Просто объявить top_speedкак protected

class Vehicle
{
protected:
double top_speed;

public:
//other public members
void describe() const;
};

Если вы не можете изменить базовый класс, вы просто не можете получить к нему доступ.

4

Джо_Б сказал

Мне не разрешено вносить изменения в данный класс

Кроме того, по-прежнему существует очень скромный способ доступа к закрытым членам класса, который вы не можете изменить (например, к третьей стороне).

Если verhicle.h (скажем, это класс, который вы не можете изменить):

class Vehicle
{
private:
double top_speed;

public:
Vehicle( double _top_speed ) : top_speed( _top_speed ) {}
};

и truck.h это:

#include "vehicle.h"class Truck: public Vehicle
{
private:
double load_capacity;

public:
Truck( double _load_capacity, double _top_speed ) :
Vehicle( _top_speed ),
load_capacity( _load_capacity )
{}

void describe() const
{
std::cout << "This is a Truck with top speed of "<< top_speed
<< " and load capacity of "<< load_capacity
<< std::endl;
}
};

Компиляция этого даст ошибку

Транспортное средство :: top_speed является частным

Тогда давайте сделаем это:

В trunk.h поменяй #include "vehicle.h" в:

#define private friend class Truck; private
#include "vehicle.h"#undef private

Не изменяя vehicle.h, вы сделали класс Truck другом вашего класса Vehicle, и теперь он может получить доступ к личным членам Vehicle!

Пожалуйста, не комментируйте, что это очень плохая идея, так как это нарушает все правила C ++ …. Я знаю, вы хотите делать это только если:

  • Вам действительно нужно получить доступ к приватному члену и у вас нет альтернативы
  • Там действительно нет способа, которым вы не можете изменить vehicle.h
  • Вы определенно знаете, что делаете, потому что если парень, который кодировал Vehicle, сделал этот атрибут закрытым, скорее всего, он не хотел, чтобы вы обращались к нему …

Раньше я делал это при настройке поведения некоторых классов MFC в прошлом … Я определенно не мог изменить заголовочные файлы, определяя их ….

1
По вопросам рекламы [email protected]