如何在运行时确定对象的基础类型
How is the underlying type of an object determined at runtime?
给定以下代码块:
class BaseClass
{
public:
virtual void hello() { cout << "Hello from Base" << endl; }
};
class DerivedClass : public BaseClass
{
public:
void hello() { cout << "Hello from Derived" << endl; }
};
int main()
{
BaseClass base;
DerivedClass derv;
BaseClass* bp = &base;
bp->hello();
bp = &derv;
bp->hello();
}
bp 指向的类型在运行时是如何确定的?我知道它是动态绑定的,但是这样做的机制是什么?我很困惑,因为通常答案是编译器,但是因为它是动态的,所以在这个例子中并非如此(或者我弄错了?我假设编译器提前这样做,但是什么表明 bp 现在指向派生类?我也来自 C#,所以这个想法对我来说很陌生,因为这是没有 CLR 的本机代码。
构造DerivedClass
时,将在其数据中插入一个不可见的成员。该成员指向称为vtable
的东西。vtable 具有指向派生类的虚函数实现的函数指针。
每个具体类(您可以实例化的类)在内存中的某个地方都有自己的 vtable。这些表只有在您拥有虚拟函数时才会生成,这是C++关于不为您不使用的东西付费的座右铭的一部分。
当编译器看到bp->hello()
时,它知道要查找该 vtable 指针,并调用正确的函数。
相关文章:
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- C++ 多态模板类,模板类型对象的实例化
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 如何构造一个 std::variant 类型对象,其自身 Templated 和构造函数转发参数
- C++:初始化指向具有不同类型对象的指针数组
- 在类 C++ 中构造的模板类型对象
- 如何将颁发者名称设置为x509_req类型对象
- 将任何数据类型/对象作为参数传递以确定其大小
- 将引用类型对象的数组从C#封送到C++
- <T> 从类型对象创建类型<T1>对象的构造函数
- C++是否有现有的方法来检查对象是否是派生类型对象
- C 模板:创建与现有对象相同的类型对象
- 链接列表中的虚函数 - 多种返回类型(对象)
- 没有适当操作员()的类型对象的呼叫
- 制作垫子类型对象的数组.输出窗口显示同一帧
- 抽象类型对象的分配
- 在std::list中就地创建自定义类型对象
- 接受泛型列表类型对象的参数
- C++-将模板类型对象强制转换为特定的数据类型
- 试图在C++中打印存储在类型对象数组中的信息