想象一下,如果我有这样的类层次结构(继承层次结构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
吗?
答案 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();
}