MST
星途 面试题库

面试题:C++类成员指针在多态中的应用

假设有一个基类Base和一个派生类Derived,Base类中有一个虚函数print()。请使用类成员指针,在一个函数中根据传入的对象类型(Base* 或Derived*),通过类成员指针正确调用print()函数,阐述实现思路并完成代码编写。
19.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义一个指向Base类中print函数的成员函数指针。
  2. 在函数中,根据传入指针的类型(通过dynamic_cast判断是否能成功转换为Derived*),来决定是否需要进行派生类特定的处理。
  3. 使用成员函数指针调用print函数。

代码实现

#include <iostream>
#include <typeinfo>

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

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

void callPrint(Base* obj) {
    void (Base::*printPtr)() = &Base::print;
    if (Derived* derivedObj = dynamic_cast<Derived*>(obj)) {
        // 如果是Derived类型,直接调用Derived的print函数
        (derivedObj->*printPtr)();
    } else {
        // 如果是Base类型,调用Base的print函数
        (obj->*printPtr)();
    }
}

可以通过以下方式测试该函数:

int main() {
    Base baseObj;
    Derived derivedObj;

    callPrint(&baseObj);
    callPrint(&derivedObj);

    return 0;
}

在上述代码中:

  1. Base类定义了虚函数print
  2. Derived类继承自Base并覆盖了print函数。
  3. callPrint函数接受一个Base*类型的指针,通过dynamic_cast判断指针指向的对象是否为Derived类型,如果是,则通过派生类对象调用print函数,否则通过基类对象调用。
  4. main函数中,分别创建BaseDerived对象,并调用callPrint函数进行测试。