我有4类,分别是Vehicle,VehicleVehicle,CargoVehicle和CrewHauler。我将绘制一个图,并将数据成员放在括号内。
Vehicle
(model, brand, year)
/ \
/ \
(model, brand, year, doors, seats) (model, brand, year, capacity)
PassengerVehicle CargoVehicle
\ /
\ /
CrewHauler
(model, brand, year, doors, seats, capacity)
一切正常。但是,当我尝试为CrewHauler写重载运算符“ cout <CrewHauler。 getDoors()以及CrewHauler。getSeats()。我应该如何解决?这是我的代码:
using namespace std;
CrewHauler::CrewHauler(std::string brand, std::string model, int year,
int doors, int seats, double capacity) :
passengerVehicle(brand, model, year, doors, seats),
cargoVehicle(brand, model, year, capacity)
{
}
std::ostream& operator<<(std::ostream& output, const CrewHauler& CrewHauler)
{
output << "------- CrewHauler -------" << endl
<< "Brand: " << CrewHauler.Vehicle::getBrand() << endl
<< "Model: " << CrewHauler.Vehicle::getModel() << endl
<< "Year: " << CrewHauler.Vehicle::getYear() << endl
<< "Doors:" << CrewHauler.getDoors() << endl
<< "Seats:" << CrewHauler.getSeats() << endl;
return output;
}
我像这样复制了您的实体(假设使用非虚拟公共继承和公共方法),并且出现了2个编译错误。第一个是关于方法调用的歧义,因为编译器不知道要使用什么路径来到达Vechicle::getBrand
,第二个是说它无法将const CrewHauler
类型转换为Vehicle&
类型。
class Vehicle {
public:
int getBrand() { return 1; }
};
class PassengerVehicle : public Vehicle {
public:
int getBrand() { return 2; }
};
class CargoVehicle : public Vehicle {
public:
int getBrand() { return 3; }
};
class CrewHauler : public PassengerVehicle, public CargoVehicle {
public:
int getBrand() { return 4; }
};
std::ostream& operator<<(std::ostream& _o, const CrewHauler& _h) {
return _o << _h.Vehicle::getBrand();
}
为了解决第一个问题,我只指定了编译器达到所需getBrand
方法所遵循的完整路径:_h.CargoVehicle::Vehicle::getBrand()
(由于端点相同,您也可以使用_h.PassengerVehicle::Vehicle::getBrand()
。]]
我不认为有一种方法可以解决第二个错误,这是由于基本方法调用所致,仅使用一个运算符重载,该重载可以同时获取您的实体类型的左值和右值,因此我将其拆分为2,一个采用非常量左值引用类型(CrewHauler&
),另一个采用(非常量)右值引用类型(CrewHauler&&
):
std::ostream& operator<<(std::ostream& _o, CrewHauler& _h) { return _o << _h.CargoVehicle::Vehicle::getBrand() << " const lvalue reference"; } std::ostream& operator<<(std::ostream& _o, CrewHauler&& _h) { return _o << _h.PassengerVehicle::Vehicle::getBrand() << " rvalue reference"; }
我编写了此示例代码以对其进行测试:
auto ch = CrewHauler(); std::cout << CrewHauler() << std::endl << ch;
将按预期输出以下内容:
1右值参考1个常量左值参考
希望这会有所帮助。