当一个类有一些虚拟方法时,它的所有方法都使用 vtable 吗?
When a class has some virtual methods, do all it's methods use a vtable?
在下面的此示例中,类型具有虚拟方法,因此具有VTable。但是,type :: bar()不是虚拟的。调用bar()时,呼叫还可以通过VTable机制,还是仅适用于foo()?
struct Base {
virtual void Foo() {}
}
struct Type : Base {
void Foo() override {}
void Bar() {}
}
Base* b = new Type();
Type* t = static_cast<Type*>(b);
t->Bar(); // Does this use a vtable?
但是,
Type::Bar()
不是virtual
。调用Bar()
时,该调用还可以通过VTable机制,还是仅适用于Foo()
?
在编译时决定呼叫非virtual
功能的功能。因此,没有充分的理由选择vtable
将呼叫调用到非virtual
函数。但是,该标准也不禁止实现vtable
甚至用于非virtual
函数。
@ejp说得更好:
该标准不需要实现用于虚拟函数。这是一个实现细节。没有使用VTABLES的理智实施会浪费空间,包括非虚拟功能
A vtable 的概念是C 标准中未进一步提及的实现细节。
但是,如果班级提供了非虚拟功能,则无需在此处包含它们,但在编译时间
相关文章:
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 我的类中有方法的指针数组,但我不能调用我的方法.代码如下
- 当一个类有一些虚拟方法时,它的所有方法都使用 vtable 吗?
- 如何处理一个子类有方法,而另一个没有方法的子类?
- 有方法的类,我不明白类的外观
- 是否有方法为模板参数指定所需的定义
- 有没有直接的方法可以在编译时获取 vtable 的地址
- 是否有方法将相对库路径添加到可执行文件以避免设置LD_library_path
- 是否有方法将所有赋值运算符(+=、*=等)转发为隐式使用重写的直接赋值运算符(=)
- 是否有方法使用vector的内容作为键和自定义值来初始化unordered_map ?
- 在调用main函数之前,是否有方法解析命令行选项?
- 在c++中是否有方法对成员变量(类)进行后期初始化?
- 是否有方法为任何指针类型定义转换操作符
- 是否有方法为窗口窗体中的特定按钮挂钩鼠标事件
- 是否有方法检测内联函数ODR违规
- 在Windows Vista+上不注册proppage.dll,是否有方法访问远程过滤器图?
- 模板:只执行类中有方法的方法
- 是否有方法使Visual Studio对include区分大小写
- 是否有方法在调用函数时防止隐式的static_cast ?