我有一个从非虚拟类派生的虚拟类.但是,当我将c派生类转换为基类时,该类已损坏.我正在使用调试器查看成员变量,并且当我执行该转换时,成员变量都已损坏.当我使用调试器进行转换(可能是虚拟指针)时,我看到有4字节的差异.对于Ex:
class A//non-virtual class
{
~A();
int fd;
};
class B:public A
{
virtual ~B();
};
Run Code Online (Sandbox Code Playgroud)
现在说B类型的obj的地址是:0x9354ed0.现在当我转换它(A*)(0x9354ed0)时,调试器将字节移动4个字节.因此,铸造的obj的起始地址是0x935ed4
将派生虚拟类转换为基于非虚拟类是错误的吗?4字节差异的原因是什么?什么是正确的投射方式?感谢您提供任何意见或解释.
这就是你所描述的.
class A
{
public:
~A();
// other stuff
};
class B: public A
{
public:
virtual ~B();
// other stuff
};
Run Code Online (Sandbox Code Playgroud)
从非虚基类派生类,并使派生类成为虚拟,这是完全合法的.4个字节的偏移量(可以是8)对应于指针类型的隐藏成员变量,该变量指向类的虚函数表.
| 归档时间: |
|
| 查看次数: |
1403 次 |
| 最近记录: |