【发布时间】:2016-02-03 18:30:39
【问题描述】:
假设情况:
struct base
{
void method()
{
requisites();
do_it();
}
virtual void requisites() const = 0;
void do_it() { /* do it */ }
};
struct derived : base
{
void requisites() const
{
if (!my_requisites)
throw something;
}
}
int main()
{
derived d;
d.method();
return 0;
}
在这种情况下,我不使用指针或引用,而是直接使用派生类型的实例,编译器是否需要对 vtable 进行运行时查询以选择正确的 requisites 覆盖( derived) 之一?还是这种行为与不使用虚函数一样有效?换句话说,编译器是否在编译时知道我们正在使用derived::requisites()?
【问题讨论】:
-
这在很大程度上取决于您使用的编译器。有些编译器很聪明,会说:“嘿,整个项目中只有一个类派生自基类,所以让我们干掉 vtable”。
-
这个问题和策略模式有什么关系?
-
@ChristianHackl 对不起,你是对的。无论如何,这将是一个“模板方法”模式。你又是对的,这个问题不是与“设计模式”相关的问题(尽管这里使用模式作为问题的上下文)
标签: c++ derived-class virtual-functions vtable