关于没有任何虚函数的继承层次结构的问题
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;
}
我认为是Vehicle
class中的那个,因为每个子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();
}
想象一下,如果我有这样的 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;
}
我认为是Vehicle
class中的那个,因为每个子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();
}