有关继承层次结构的问题,没有任何虚拟功能

Question about Inheritance Hierarchy without any virtual function

本文关键字:任何 虚拟 功能 问题 继承 层次结构      更新时间:2023-10-16

想象一下,如果我有这样的类Hierachy(继承层次结构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() << "nn"; 
}
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)一样。它仍然会在Vehicle类中调用get_description()吗?

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

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

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

请注意,在这种情况下,您不会超越策略。但是您定义了一个隐藏基类功能的新功能。

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

在这里,一个小片段显示不同的情况:

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(); 
}

在线演示