gpt4 book ai didi

c++ - C++中虚表的结构是怎样的?

转载 作者:可可西里 更新时间:2023-11-01 18:02:13 28 4
gpt4 key购买 nike


例如,我有两个“接口(interface)”和类类型:

class IPlugin
{
public:
virtual void Load(void) = 0;
virtual void Free(void) = 0;
};

class IFoo
{
public:
virtual void Foo(void) = 0;
};


class Tester: public IPlugin, public IFoo
{
public:
Tester() {};
~Tester() {};

virtual void Load()
{
// Some code here
}

virtual void Free()
{
// Some code here
}

virtual void Foo(void)
{
// Some code here
}
};

对于 Tester 类型的实例,vtab 实际上有什么结构? dynamic_cast 运算符将如何在表达式中执行操作(我的意思是 dynamic_cast 运算符将如何扫描 vtab 以进行有效的引用类型转换):

Tester* t = new Tester();
IPlugin* plg = dynamic_cast<IPlugin*>(t);
IFoo* f = dynamic_cast<IFoo*>(plg);

提前致谢!

最佳答案

C++ 中的虚拟表是一个实现细节。下图显示了一种可能的实现方式。

Virtual table diagram

类的两个实例(A 和 B)存在。每个实例都有两个 vtbl 指针,vtbl 包含指向实际代码的指针。

在您的示例中没有实例数据,但出于说明目的,我假设每个类都包含一些实例数据。

当指向 Tester 的指针转换为指向 IFoo 的指针时,指针会如图所示进行调整。它不是指向实例数据的开头,而是指向实例数据的 IFoo 部分。

巧妙的是,使用 IFoo 指针的调用者对类的 IFoo 部分周围的数据一无所知。对于使用 IPlugin 指针的调用者来说也是如此。该指针恰好指向实例数据的开头,该实例数据也由 Tester 指针指向,但只有使用 Tester 指针的调用方才知道实例数据的整个布局。

使用 dynamic_cast 需要图表上没有的 RTTI(运行时类型信息)。 vtbl 将包含额外的类型信息,这些信息给 IFoo 一个指向 Tester 实例的指针,允许代码在运行时发现指针指向的对象的实际类型并用它来向下转换指针。

关于c++ - C++中虚表的结构是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5868431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com