MST

星途 面试题库

面试题:C++中虚拟函数与普通函数在多态场景下的调用差异

请描述在C++中,当存在继承关系时,普通函数和虚拟函数在通过基类指针或引用调用派生类对象函数时,调用机制有何不同?请通过代码示例说明。
22.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

普通函数调用机制

在C++中,通过基类指针或引用调用派生类对象的普通函数时,是根据指针或引用的类型(即基类类型)来确定调用哪个函数。也就是说,调用的是基类中定义的普通函数,而不会调用派生类中重写的同名普通函数。

以下是代码示例:

#include <iostream>

class Base {
public:
    void normalFunction() {
        std::cout << "Base::normalFunction" << std::endl;
    }
};

class Derived : public Base {
public:
    void normalFunction() {
        std::cout << "Derived::normalFunction" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->normalFunction(); // 调用Base::normalFunction

    delete basePtr;
    return 0;
}

虚拟函数调用机制

通过基类指针或引用调用派生类对象的虚函数时,是根据对象的实际类型(即派生类类型)来确定调用哪个函数。这就是所谓的动态绑定或运行时多态。

以下是代码示例:

#include <iostream>

class Base {
public:
    virtual void virtualFunction() {
        std::cout << "Base::virtualFunction" << std::endl;
    }
};

class Derived : public Base {
public:
    void virtualFunction() override {
        std::cout << "Derived::virtualFunction" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->virtualFunction(); // 调用Derived::virtualFunction

    delete basePtr;
    return 0;
}

总结来说,普通函数调用基于指针或引用类型,而虚函数调用基于对象实际类型,虚函数实现了运行时多态,普通函数不具备这种特性。