C++是否有一种不使用虚函数表的静态多态性接口实现?

6

C++有没有不使用虚表的适当接口实现?

例如:

class BaseInterface{
public:
virtual void func() const = 0;
}

class BaseInterfaceImpl:public BaseInterface{
public:
void func(){ std::cout<<"called."<<endl; }
}

BaseInterface* obj = new BaseInterfaceImpl();
obj->func();

在最后一行对func的调用会去vtable中查找BaseInterfaceImpl::func的函数指针,但是除了纯接口类BaseInterface之外,BaseInterfaceImpl没有从任何其他类继承。是否有任何C ++方法可以直接完成这个操作?

谢谢。

Gil。


因为我正在处理一个速度很重要的项目。同时,我认为虚函数表是完整面向对象多态性的一个很好的解决方案,但对于实现“接口”来说有些过度,希望能有一些更轻量级的解决方案存在。 - gilbertc
@gilbertc:我认为这里有一个误解。任何“适当”的接口概念实现都需要经过类似虚函数表的过程。否则,动态多态将是不可能的。 - Thomas
1
我想说,如果你关心多态性开销,那么你要么使用的是错误的语言,要么是在错误的方式下使用该语言。进行性能分析并查看你正在消耗循环的位置。如果问题出现在虚函数表中,那将非常令人惊讶。 - Joel
你有实际测量过吗?虚拟分派机制(在这种简单情况下)非常快,通常只需要一次解引用。但是,如果只有一种可能的实现,那么拥有接口的意义何在? - David Rodríguez - dribeas
@David:为了未来的更改?创建一个接口和实现会更容易...即使永远不需要其他实现...也比创建一个简单的类并意识到您需要另一个实现(例如用于单元测试)要容易。 - Matthieu M.
显示剩余3条评论
2个回答

7

是的。它被称为“奇异递归模板模式”(CRTP)。看一下。


特别是,“静态多态性”标题:http://en.wikipedia.org/wiki/Template_metaprogramming#Static_polymorphism或许你可以将那个例子编辑进你的答案里? - Thomas
没问题。我很好奇,你的代码是那么优化的,即使是虚函数表查找的小开销也会影响性能吗?是什么应用程序?通常它被用作节省空间或实现RAII关注的方式。 - wheaties

0

我认为无论是哪种语言,要进行动态分派就必须要转到某个等价于虚函数表的地方,除非在编译时就知道需要调用哪个函数。这可能是聪明的编译器优化的结果,也可能是CRTP(正如wheaties已经提到的那样)这样的技术。


顺便说一下,我不明白为什么通过vtable进行这样的调用会被认为是“不合适”的。 - rmeador
@thomas,rmeador:认同我不应该使用“proper”这个词。应该是朝着接口的“更高效”和“轻量级”的方向实现。 - gilbertc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接