Weird error message when there is ambiguity in inheritance
In the chapter about inheritance in the C++ training, we create at some point a blue_bike
, which inherits from two classes that both define a namesake method.
When calling:
blue_bike.Print(); // COMPILATION ERROR: should it call int BlueObjects::Print() or void Vehicle::Print() const ?
we get a message which is not the usual one related to compilation errors:
Sorry, no help is available on 'blue_bike.Print(); // COMPILATION ERROR: should it call int BlueObjects::Print() or void Vehicle::Print() const '.
It is not related to the name Print()
- I tried renaming it otherwise and the result was the same.
It seems not to be an effect of cppyy itself: following Python code:
import cppyy
code1 = """
#include <iostream>
enum class motor_type { none, thermic, electric };
class Vehicle
{
public:
Vehicle(motor_type type);
void Print() const { std::cout << "I'm a Vehicle!" << std::endl; }
private:
motor_type type_;
};
class ElectricBicycle : public Vehicle
{
public:
ElectricBicycle();
};
class ThermicCar : public Vehicle
{
public:
ThermicCar();
};
class ElectricVehicle : public Vehicle
{
public:
ElectricVehicle();
};
class ElectricCar : public ElectricVehicle
{
public:
ElectricCar() = default;
};
class BlueObjects
{
public:
BlueObjects() = default;
int Print()
{
std::cout << "I'm blue!" << std::endl;
return 42;
}
};
class BlueVehicle : public Vehicle, public BlueObjects
{
public:
BlueVehicle(motor_type type);
};
"""
cppyy.cppexec(code1)
code2 = """
Vehicle::Vehicle(motor_type type)
: type_(type)
{ }
"""
cppyy.cppexec(code2)
code2 = """
ElectricBicycle::ElectricBicycle()
: Vehicle(motor_type::electric)
{ }
"""
cppyy.cppexec(code2)
code2 = """
ThermicCar::ThermicCar()
: Vehicle(motor_type::thermic)
{ }
"""
cppyy.cppexec(code2)
code2 = """
ElectricVehicle::ElectricVehicle()
: Vehicle(motor_type::electric)
{ }
"""
cppyy.cppexec(code2)
code2 = """
BlueVehicle::BlueVehicle(motor_type type)
: Vehicle(type), // mandatory call of the non-default constructor
BlueObjects() // not mandatory: default constructor called anyway if not specified explicitly
{ }
"""
cppyy.cppexec(code2)
code2 = """
BlueVehicle blue_bike(motor_type::none);
"""
cppyy.cppexec(code2)
code2 = """
blue_bike.Print(); // COMPILATION ERROR: should it call int BlueObjects::Print() or void Vehicle::Print() const ?
"""
cppyy.cppexec(code2)
gives away expected output.