有关继承层次结构的问题,没有任何虚拟功能
Question about Inheritance Hierarchy without any virtual function
想象一下,如果我有这样的类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();
}
在线演示
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 虚拟决赛作为安全
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在不产生任何垃圾的情况下获得C中的像素
- 是否有任何模式等效于虚拟模板功能?
- C++如何使虚拟函数返回任何类型的指针
- 此constexpr虚拟功能技术是否违反了任何C 11/C 14规则
- 有关继承层次结构的问题,没有任何虚拟功能
- 调用虚拟函数而不通过类类型指针创建任何对象
- 覆盖纯虚拟函数时,使用“覆盖”是否有任何意义
- 如果未使用虚拟函数,则使用基类指针派生类的任何目的
- 在 C++11 中同时使用虚拟关键字和覆盖关键字是否有任何细微之处
- 有没有任何方法可以从C++中的char中获取虚拟密钥代码
- 在虚拟继承中调用非虚拟基方法是否有任何额外的成本
- 从析构函数调用虚拟函数-任何解决方法
- 通过GUI的作业进程在同一个虚拟处理器上执行,或者通过命令行使用任何空闲的虚拟处理器
- 让Eclipse自动实现纯虚拟函数的任何方法
- 在中实现纯虚拟函数是否有任何用途
- 给定64位虚拟地址空间,任何不在堆栈上声明32KB数组的理由