MST

星途 面试题库

面试题:C++类内成员函数调用与多态的结合

定义一个基类`Base`,包含虚函数`void print()`。再定义一个派生类`Derived`继承自`Base`,并重写`print`函数。在`Base`类中添加一个成员函数`void callPrint()`,在该函数内部以不同的成员函数调用方式(静态绑定和动态绑定)调用`print`函数。请编写完整代码,并解释在不同调用方式下的行为及原因。
23.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

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

    void callPrint() {
        // 静态绑定,直接调用Base类的print函数
        Base::print(); 
        // 动态绑定,根据对象的实际类型调用相应的print函数
        this->print(); 
    }
};

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

不同调用方式下的行为及原因

  1. 静态绑定(Base::print()

    • 行为:无论callPrint函数是由Base对象还是Derived对象调用,都会调用Base类的print函数。
    • 原因:使用类名限定符Base::明确指定了调用Base类的print函数,这是一种静态绑定方式,编译器在编译时就确定了调用的函数,与对象的实际类型无关。
  2. 动态绑定(this->print()

    • 行为:如果callPrint函数由Base对象调用,会调用Base类的print函数;如果由Derived对象调用,会调用Derived类的print函数。
    • 原因:通过this指针调用虚函数print,这是动态绑定方式。在运行时,根据this指针所指向对象的实际类型(BaseDerived)来决定调用哪个类的print函数。虚函数机制使得编译器在运行时能够根据对象的实际类型来确定要调用的函数版本,实现了多态性。

你可以通过以下方式测试代码:

int main() {
    Base b;
    b.callPrint();

    Derived d;
    d.callPrint();

    return 0;
}

main函数中分别创建BaseDerived对象,并调用callPrint函数,可以看到不同的输出结果,验证上述分析。