C++多态的底层实现(面试题)

本文介绍了多态在面向对象编程中的重要性,包括其通过继承、接口实现和虚函数实现的方式。重点讲解了虚函数和动态绑定在多态底层实现中的作用,以及虚函数表如何决定调用正确版本的函数。
摘要由CSDN通过智能技术生成

  多态(polymorphism)是面向对象编程中的一个重要概念,它允许使用统一的接口来操作不同的对象,从而提高代码的灵活性和可扩展性。多态可以通过继承、接口实现、函数重载等方式实现。

  在面向对象编程中,多态的底层实现通常涉及到虚函数(virtual function)和动态绑定(dynamic binding)。下面是多态的底层实现的一般步骤:

1、定义基类和派生类:首先需要定义一个基类(父类),并在其中声明一个或多个虚函数。然后从基类派生出一个或多个派生类(子类),可以选择性地覆盖基类中的虚函数。

class Shape {
public:
    virtual void draw() const {
        // 基类中的虚函数
        std::cout << "Drawing a shape.\n";
    }
};

class Circle : public Shape {
public:
    void draw() const override {
        // 派生类中覆盖的虚函数
        std::cout << "Drawing a circle.\n";
    }
};

class Square : public Shape {
public:
    void draw() const override {
        // 派生类中覆盖的虚函数
        std::cout << "Drawing a square.\n";
    }
};

2、 使用基类指针或引用调用虚函数: 在使用多态时,通常使用基类的指针或引用指向派生类的对象,然后调用虚函数。由于虚函数的动态绑定特性,程序会在运行时确定调用哪个版本的虚函数。

int main() {
    Shape* shapePtr;

    Circle circle;
    Square square;

    shapePtr = &circle;
    shapePtr->draw();  // 输出: Drawing a circle.

    shapePtr = &square;
    shapePtr->draw();  // 输出: Drawing a square.

    return 0;
}

3、 虚函数表(vtable):在编译过程中,编译器会为每个包含虚函数的类生成一个虚函数表。虚函数表是一个指针数组,存储了该类中所有虚函数的地址。当对象被创建时,会包含一个指向虚函数表的指针(通常称为虚函数指针或vtbl指针)。当调用虚函数时,程序会根据对象的虚函数指针找到相应的虚函数表,并根据函数在表中的偏移量来调用正确的虚函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值