假设我有一个基类指针,基类具有虚函数。如果我使用基类指针指向派生类对象,那么编译器如何知道它是要调用的虚拟函数的派生版本,因为在赋值时派生类地址将被转换为基类类型,为什么不由于两者的内存布局可能不同,因此编译器会生成错误。
如果我已经声明了基类析构函数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.
}
答案 0 :(得分:1)
要通过基指针实际删除派生类,需要声明析构函数virtual。否则会造成严重破坏(实际上未定义的行为,大致相同)。
至于如何实现virtual
函数:由实现决定。在不询问具体实施的情况下,真正的答案是不可能的。最可能的实现是vtables。
答案 1 :(得分:1)
它不会(或它会)。通过指向没有virtual
析构函数的基类型的指针删除派生类型的对象是未定义的行为。