【发布时间】:2013-06-01 18:36:27
【问题描述】:
在 C++ 中,当可以使用运行时(子类、虚函数)或编译时(模板、函数重载)多态性来实现相同的功能时,为什么要选择其中一个?
我认为对于编译时多态性(为模板类型创建更多方法/类定义),编译后的代码会更大,并且编译时会给你更多的灵活性,而运行时会给你“更安全”的多态性(即更难意外误用)。
我的假设是否正确?两者还有其他优点/缺点吗?谁能举一个具体的例子,两者都是可行的选择,但其中一个显然是更好的选择?
另外,编译时多态性是否会产生更快的代码,因为不需要通过 vtable 调用函数,或者编译器是否已经优化了这一点?
例子:
class Base
{
virtual void print() = 0;
}
class Derived1 : Base
{
virtual void print()
{
//do something different
}
}
class Derived2 : Base
{
virtual void print()
{
//do something different
}
}
//Run time
void print(Base o)
{
o.print();
}
//Compile time
template<typename T>
print(T o)
{
o.print();
}
【问题讨论】:
-
编译时多态性的主要缺点是有时你无法做到这一点。就像您通过界面管理对象一样。只要您可以使用编译时,猜测它在大多数情况下会更好。只需一点点努力,您就可以让您的日常工作同时接受这两者。
-
“运行时”示例无法编译 - 可以传递基类指针并实现动态调度,但由于 Base 是抽象的,因此无法创建对象。
标签: c++ architecture polymorphism