gpt4 book ai didi

c++ - 复制对象时的虚拟表

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:12:10 25 4
gpt4 key购买 nike

#include <iostream>
#include <string>
class A
{
public:
A(int a) : _a(a) {}
virtual ~A() {}
virtual void f() const {std::cout << _a << std::endl;}
private:
int _a;
};
class B : public A
{
public:
B(int a, int b) : A(a), _b(b) {}
virtual void f() const {std::cout << _b << std::endl;}
private:
int _b;
};
int main()
{
B b (1,2);
A a (5);
A& ref = a;
ref = b;
ref.f();
return 0;
}

输出:

1

我了解到,将派生(扩展)类对象复制到基类对象时,派生对象被剪切,只复制基类数据。但我认为'ref'的虚拟表现在应该是'b'的虚拟表所以'ref.f();'应该调用函数:

void B::f() const {std::cout << _b << std::endl;}

但是在复制之后 'ref' 的 vtbl 仍然是类 A 的 vtbl。为什么?谢谢。

最佳答案

首先,“虚拟表”不是标准的 C++ 概念。实现动态绑定(bind)和实现虚函数是一种高度实现特定的机制。

话虽如此,

But i thought that the virtual table of 'ref' now should be as a virtual table of 'b' so 'ref.f();' should call the function

这是不正确的。虚拟表是每个类而不是每个对象。每个对象只有 Vptr。

“ref”的类型(由 typeid(ref).name 确认)是“A &”。当您分配 'ref = b' 时,将以对象 'b' 作为参数调用 'A' 的隐式赋值运算符。该运算符只是盲目地将“b”的“A”子对象复制到“ref”(即“a”)引用的当前对象中。因此,对象“a”现在与“b”的“A”子对象具有完全相同的状态。

如您所见,在这整个很长的故事中,VTABLE 和 VPTR 根本不存在!

关于c++ - 复制对象时的虚拟表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3850711/

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