gpt4 book ai didi

c++ - vtable 和多态性 - 函数的偏移量

转载 作者:行者123 更新时间:2023-11-30 04:00:58 25 4
gpt4 key购买 nike

如果我理解正确的话,类定义会在 vtable 中强加一定的虚函数顺序,因此已知给定的函数位于表开头的某个偏移量处。但是,我不明白它如何与多态性一起工作。

class B1 {
virtual void funcB1();
};

class B2 {
virtual void funcB2() {}
};

class D : public B1, public B2 {
virtual void funcB1() {}
virtual void funcB2() {}
};

void main(...) {
B1 *b1 = new D();
B2 *b2 = new D();
B1 *realB1 = new B1();
B2 *realB2 = new B2();

b1->funcB1();
b2->funcB2();
realB1->funcB1();
realB2->funcB2();
}

生成的代码如何知道如何访问不同偏移量的 funcB2?

最佳答案

当您从两个基类组成一个类时,每个部分在生成的类中都由一个功能齐全的 block 表示,并带有自己的指向 vtable 的指针。这就是生成的代码知道要调用哪个函数的方式:将 D 的指针转换为 B1B2 会产生不同的指针,因此生成的代码可以在虚拟表中使用相同的偏移量。

D *d = new D();
B1 *b1 = dynamic_cast<B1*>(d);
B2 *b2 = dynamic_cast<B2*>(d);
printf("%p %p %p", (void*)d, (void*)b1, (void*)b2);

produces the following output on ideone :

0x91c7008 0x91c7008 0x91c700c

请注意 D*B1* 打印相同的值,而 B2* 打印不同的值。当你调用b2->funcB2()时,指针b2已经指向了D对象的不同部分,它指向了不同的vtable(具有 B2 布局的那个),因此生成的代码不需要为 b2realB2 在您的示例。

关于c++ - vtable 和多态性 - 函数的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26022060/

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