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

时间:2019-03-05 22:18:51

标签: c++ inheritance polymorphism virtual-functions

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

Vehicle 
     MotorVehicle
         Automobile 
         Motorcycle 
     WaterCraft 
         Sailboat
          Canoe

如果Vehicle类包含名为get_retail_price()get_description()的函数,并且get_description()函数被层次结构中的每个子类覆盖,而基类中没有虚拟函数类,哪个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;
}

我认为它是Vehicle类中的那个,因为每个子类都在重新定义get_descritption()函数。但是调用它的Vehicle类。我猜对了吗?

最后一个问题,如果display_vehicle(const Vechicle& v)具有任何类的返回类型会发生什么?类似于Automobile display_vehicle(const Vehicle& v)。它还会在get_description()类中调用Vehicle吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

请注意,在这种情况下,您不会覆盖功能。但是您定义了一个新函数,该函数隐藏了基类的函数。

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

这里有一个小片段来显示不同的情况:

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