关于没有任何虚函数的继承层次结构的问题

Question about Inheritance Hierarchy without any virtual function

想象一下,如果我有这样的 class 层次结构(继承层次结构 A):

Vehicle 
     MotorVehicle
         Automobile 
         Motorcycle 
     WaterCraft 
         Sailboat
          Canoe

如果 Vehicle class 包含名为 get_retail_price()get_description() 的函数,并且 get_description() 函数被每个子 class 覆盖在层次结构中,基 class 中没有虚函数,以下代码执行哪个 get_description() 函数?

void display_vehicle(const Vehicle& v) 
{
    std::cout << "Description: " << v.get_description() << ‘\n’ 
              << "Retail price: " << v.get_retail_price() << "\n\n"; 
}

int main() 
{ 
    Motorcycle motorcycle("Harley-Davidson FXDR 114", 21349.0);   
    display_vehicle(motorcycle); 

    return 0;
}

我认为是Vehicleclass中的那个,因为每个子class都在重新定义get_descritption()函数。但是调用它的是 Vehicle class。我的假设是否正确?

最后一个问题,如果 display_vehicle(const Vechicle& v) 有任何 class 的 return 类型会怎样?类似于 Automobile display_vehicle(const Vehicle& v)。它还会在 Vehicle class 中调用 get_description() 吗?

对于非虚拟的成员函数,调用的是已知类型的函数。

在这里,唯一已知的类型是 Vehicle

void display_vehicle(const Vehicle& v) 
{
    std::cout << "Description: " << v.get_description() << ‘\n’ 
              << "Retail price: " << v.get_retail_price() << "\n\n"; 
}

顺便请注意,在这种情况下,您不会覆盖函数。但是你定义了一个新的函数,它隐藏了基class的函数。

如果该函数是虚函数,则将调用该对象的真实类型的函数。

这里是展示不同情况的小片段:

class Vehicle {
public:  
    virtual void show() { cout<<"I'm a vehicle"<<endl; }   // virtual
    void print() { cout <<"I'm a vehicle"<<endl; }         // not virtual
    void invokeshow() { show(); }                          // not virtual but invoking virtual
    void invokespecificshow() { Vehicle::show(); }         // not virtual invoking specific
    ~Vehicle() {}                                //at least one virtual ?  then virtual destructor
}; 

class Motorcycle: public Vehicle {
public:  
    void show() override { cout<<"I'm a motorcycle"<<endl; }
    void print() { cout <<"I'm a motorcycle"<<endl; }
}; 

void test(Vehicle &v) {
    v.show(); 
    v.print();
    v.invokeshow(); 
    v.invokespecificshow(); 
}

Online demo