【C++ 多态面试问题 】 对象中几个虚函数表指针?虚析构函数?

本文探讨了C++中的多态性,包括编译时和运行时多态的实现方式。重点讲解了虚函数在运行时多态中的作用,以及子类如何通过继承和重写虚函数实现多态。同时,解释了子类对象内存结构中包含的虚函数表,并指出每个子类对象只有一个虚函数表指针。最后,讨论了虚析构函数的概念,强调了它在确保正确销毁派生类对象中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试问到多态的问题,我是这样回答的:

多态分为编译时多态和运行时多态。
编译时多态就是函数重载来实现的。
运行时多态是用虚函数来实现。
主要是子类重写父类的虚函数,使用父类引用或者父类指针来调用。
对象首地址是有一个指向虚函数表的指针的。
虚函数表存储虚函数的地址。
汇编的时候直接调用虚函数表中对应的函数。
 Base_L* b = new Son();
    b->mm();
    或者
 Son son;
 Base_L& refBase = son;
   refBase.mm();

面试官问题

然后他问我,父类有一个虚函数,子类继承父类,子类有没有虚函数表。我迟疑了。
支支吾吾半天说不出来。子类是有父类的虚函数表指针的。子类是有父类的整个数据的
子类对象内存中本来就存在父类的一个实例,当然包含父类的所有东西。

子类继承父类,重写父类虚函数,那么子类对象中有几个虚函数表指针?
2个 一个是子类的,一个是父类的。
子类继承父类,那么子类对象中有几个虚函数表指针?
1个 那个是父类的。

虚析构是怎么回事

class object 
{
public:
    object() { value = 10; }
    virtual void speak() { cout << "object::speak" << endl; }
    virtual ~object() 
    {
        cout << "object::~object" << endl;
    }

private:
    int value;
};

class SonObject :public object
{
public:
    SonObject() {}
     ~SonObject()
    {
        cout << "SonObject::~SonObject" << endl;
    }
    virtual void speak() { cout << "SonObject::speak" << endl; }
private:
};

int main()
{


    object* o = new SonObject();
    o->speak();

    delete o;

    return 0;
}   


如果不写,delete p; 的时候只会调用父类析构函数,派生类对象的空间没有释放掉。
基类声明虚析构函数,其实子类也有析构函数,我理解子类相当于把虚析构函数重写了,来支持多态。先调用子类析构函数,再调用父类析构函数

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值