【发布时间】:2013-12-30 16:53:40
【问题描述】:
不使用虚函数,是否可以使用类似的东西:
void BaseClass::functionName () { // BaseClass already has virtual functions
// some LONG code true for all derived classes of BaseClass
// ...
if (typeid (*this) == typeid (DerivedClass1))
// use functions of DerivedClass1 on dynamic_cast<DerivedClass1*>(this)
else if (typeid (*this) == typeid (DerivedClass2))
// use functions of DerivedClass2 on dynamic_cast<DerivedClass2*>(this)
// some LONG code true for all derived classes of BaseClass
// ...
}
只是我觉得像上面那样使用虚函数不是一个好主意,因为它只是专门用于派生类的一小部分。用于所有派生类的长代码将需要一遍又一遍地用于所有派生类(为此建议使用辅助函数)。当然,我已经测试了我的方法并且它有效(并且我认为性能没有损失),但我想知道这是否是有问题的做法。 如果在函数中多次使用 if-else-if 部分怎么办?
如果所有派生类的公共代码相对较短,那么最好使用虚函数,对吗?
【问题讨论】:
-
使用适当的语言进行标记将有助于您的问题被正确的用户发现。
-
这取决于你对“错误”的定义。 C++ 多态性的全部意义在于避免这样的代码。基类必须知道其所有派生类也很奇怪。所以听起来你所追求的是template method pattern。如果您不习惯将任意行为放入各个类中,您可以随时应用 visitor pattern 或类似的东西。
-
另外,关于性能。如果这是在某个时间关键的内部循环中,一堆顺序类型查找将比虚函数调用慢很多。
-
虚拟函数是专门发明的,所以你不需要做那样的事情。这是为了避免在 70 年代/80 年代初期常见的巨大的 if-else/switch 语句。像使用 goto 一样谨慎使用 RTTI。它现在可能用于一小部分,但未来呢?维护人员会看到您在做什么,并复制相同的样式但功能非常强大。突然之间,这将在所有地方使用,而我们在你不知不觉中,你又回到了大量的 if-else。
标签: c++ function virtual dynamic-cast