Cout 过载 操作用于多重继承



我有4个类,车辆,乘客车辆,货运车辆和船员运输。我将绘制一个图表并将数据成员放在括号内。

Vehicle
(model, brand, year)
/                         
/                           
(model, brand, year, doors, seats)          (model, brand, year, capacity)
PassengerVehicle                           CargoVehicle
                         /
                       /
CrewHauler
(model, brand, year, doors, seats, capacity)

一切都很好。但是当我尝试为 CrewHauler 编写重载运算符"cout <<"时,它一直说"对象具有与成员函数 "passengerVehicle::getDoors" 不兼容的类型限定符",并下划线 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() << " 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 右值引用

希望这能有所帮助。