【发布时间】:2015-01-15 20:40:54
【问题描述】:
我面临以下问题。
我实现了父类 - Vehicle,它有一些派生类,其中之一 - FastVehicle。
在程序中,我需要存储一个 Vehicle* 指针向量。指针可能指向 Vehicle 对象或 FastVehicle 对象。
1) 我希望能够为向量中的每个对象调用 print() 方法。 问题是,在 FastVehicle 的情况下,我还想将参数传递给函数, 我需要调用一个带有签名的函数:
void print(int a)
我对虚函数机制略知一二,但据我所知,它只有在两个函数具有相同签名的情况下才有效。
我想听听关于如何解决的建议。
2) 另外在派生类FastVehicle 中还有一些独特的功能,它不与父类Vehicle 共享。 它执行的任务应该只对 FastVehicle 对象执行。 实现这一目标的最干净的方法是什么? 我想也许可以在父类 Vehicle 中实现“空”虚函数,并在 FastVehicle
的覆盖方法中实现“真实”任务也许有人可以提出更好的解决方案。
谢谢
【问题讨论】:
-
要么实现通用接口,要么使用dynamic_cast。
-
dynamic_cast是如果您真的希望派生类具有不兼容的接口的答案。如果可以的话,定义一个通用接口会更简洁。 -
不得不使用
dynamic_cast通常表明你考虑得不够充分。 -
您应该首先考虑您的设计。 FastVehicle 能做哪些车辆不能做的事情?如果它只是跑得更快,那么 Vehicle 应该有一个 speed 成员,而更快的车辆只是将它设置得更高。
-
一个类似的问题 - 也涉及汽车 :) - 可以在这里找到:stackoverflow.com/questions/7200446/… IMO,这是一个完全合法的向下转换用例。
标签: c++ inheritance virtual-functions