非虚基类的虚拟派生类

VNa*_*haM 2 c++ inheritance

我有一个从非虚拟类派生的虚拟类.但是,当我将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字节差异的原因是什么?什么是正确的投射方式?感谢您提供任何意见或解释.

Did*_*set 8

这就是你所描述的.

class A
{
public:
  ~A();
  // other stuff
};

class B: public A
{
public:
  virtual ~B();
  // other stuff
};
Run Code Online (Sandbox Code Playgroud)

从非虚基类派生类,并使派生类成为虚拟,这是完全合法的.4个字节的偏移量(可以是8)对应于指针类型的隐藏成员变量,该变量指向类的虚函数表.