gpt4 book ai didi

c++ - 为什么我不能从转换的字节(字符)数组中调用虚函数?

转载 作者:太空宇宙 更新时间:2023-11-04 15:03:47 24 4
gpt4 key购买 nike

例如,有 A 类,

class A{
public:
int x;
void Update(){
cout << " from a\n";
}
};

为了在不调用构造函数的情况下实例化 A 的对象,它是这样的:

A* a = (A*) new char[sizeof(A)];

a->x = 9;
cout << a->x; a->Update(); //"9 from a" is outputted

现在万一Update是虚函数

class A{
public:
int x;
virtual void Update(){
cout << " from a\n";
}
};

它抛出一个“访问冲突”异常,为什么?

最佳答案

当一个类声明一个或多个虚函数时,编译器会隐式地将一个 V 表指针添加到类声明中,从而添加到每个对象中。

对于每个虚函数调用,编译器都会生成代码,从对象的 V 表指针中读取函数地址,然后跳转到该地址。

对象的 V-Table 指针仅在运行时初始化,即调用类的构造函数并创建对象时。

因此,当您在没有显式调用对象的类构造函数的情况下创建对象时,该对象的 V-Table 指针不会被初始化。

然后,当您调用该对象的虚函数时,CPU 会尝试从该对象的 V 表指针读取该函数的地址,并发生内存访问冲突。

关于c++ - 为什么我不能从转换的字节(字符)数组中调用虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22280611/

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