【发布时间】:2010-12-30 03:40:30
【问题描述】:
编译器究竟什么时候创建虚函数表?
1) 当类包含至少一个虚函数时。
或
2) 当直接基类包含至少一个虚函数时。
或
3) 当层次结构中任何级别的任何父类至少包含一个虚函数时。
与此相关的问题: 是否可以放弃 C++ 层次结构中的动态调度?
例如考虑下面的例子。
#include <iostream>
using namespace std;
class A {
public:
virtual void f();
};
class B: public A {
public:
void f();
};
class C: public B {
public:
void f();
};
哪些类将包含 V-Table?
既然 B 没有将 f() 声明为虚拟,那么类 C 是否获得动态多态性?
【问题讨论】:
-
除非你正在编写一个编译器(你不是因为你问了这个问题),否则它与任何 C++ 用户完全无关。该语言甚至没有 vTable 的概念。
-
除非你有一些关于现代微处理器设计的下一个架构突破的内部信息,否则我会停止所有关于 vtables 不是语言一部分的宣传。在 C++ 文献中到处都提到了 Vtables(不是标准)。其次,现代项目经常选择 C++,因为它生成的确定性代码——知道生成了一个 vtable 是这方面的重要组成部分。
-
@LokiAstari - 了解 C++ 不仅仅是肤浅的语言。另外,如果你对事物的工作原理不感兴趣,你就不是真正的程序员;]
-
@Di-0xide:在 C++ 中,除了担心不会影响您编写代码的深奥实现细节之外,还有更多的东西需要理解。即使你认为你知道它们是如何工作的,你仍然真的不知道。唯一真正了解 v-table 复杂性的人是已经实现它们的人(而且周围几乎没有 C++ 编译器编写者)其他人(根据我的经验)猜测通常是错误的。
-
@Di-0xide:即使您手动操作了 v-tables(您不是,不要傻到声称您是)。您无法从这样的讨论中获得任何信息。没有足够的空间来提供所需的详细信息。
标签: c++ polymorphism virtual-functions vtable