В настоящее время я занят наследованием и работаю с базовым классом 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
функция, чтобы исправить это?
Самый простой способ — использовать общедоступную функцию доступа в базовом классе, возвращающую копию текущего значения. прошлой что вы хотите сделать, это предоставить личные данные подклассам (*).
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?
Просто объявить top_speed
как protected
class Vehicle
{
protected:
double top_speed;
public:
//other public members
void describe() const;
};
Если вы не можете изменить базовый класс, вы просто не можете получить к нему доступ.
Джо_Б сказал
Мне не разрешено вносить изменения в данный класс
Кроме того, по-прежнему существует очень скромный способ доступа к закрытым членам класса, который вы не можете изменить (например, к третьей стороне).
Если 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 ++ …. Я знаю, вы хотите делать это только если:
Раньше я делал это при настройке поведения некоторых классов MFC в прошлом … Я определенно не мог изменить заголовочные файлы, определяя их ….