派生对象地址分配给基指针和调用析构函数的机制

时间:2012-12-30 18:59:13

标签: c++ destructor

假设我有一个基类指针,基类具有虚函数。如果我使用基类指针指向派生类对象,那么编译器如何知道它是要调用的虚拟函数的派生版本,因为在赋值时派生类地址将被转换为基类类型,为什么不由于两者的内存布局可能不同,因此编译器会生成错误。

如果我已经声明了基类析构函数virtual并删除了具有派生类地址的基指针,那么编译器如何知道我实际上正在删除派生对象。

class a{
public:
virtual ~a(){}
virtual void f(){}
};
class b:public a
{
  public:
  ~b(){}
  void f(){ cout<<"hi";}
};
main()
{
  a *aptr;
  aptr=new b;   //here aptr has the address of b;
  delete aptr;  //since pointer type is base class so how will compiler know that
                //it has to call derived's destructor,also their names are different
                //as one is a and another is b. 
} 

2 个答案:

答案 0 :(得分:1)

要通过基指针实际删除派生类,需要声明析构函数virtual。否则会造成严重破坏(实际上未定义的行为,大致相同)。

至于如何实现virtual函数:由实现决定。在不询问具体实施的情况下,真正的答案是不可能的。最可能的实现是vtables

答案 1 :(得分:1)

它不会(或它会)。通过指向没有virtual析构函数的基类型的指针删除派生类型的对象是未定义的行为。