MST

星途 面试题库

面试题:C++函数重载与类型匹配的复杂场景

考虑以下C++代码: ```cpp class Base {} class Derived1 : public Base {} class Derived2 : public Base {} void func(Base& b); void func(Derived1& d1); void func(Derived2& d2); int main() { Base* ptr1 = new Derived1(); Base* ptr2 = new Derived2(); // 请分别写出如何通过ptr1和ptr2调用对应的func函数,且要明确写出调用规则依据 // 调用func(Derived1&)通过ptr1 // 调用func(Derived2&)通过ptr2 delete ptr1; delete ptr2; return 0; } ```请完成代码中注释部分,并详细解释调用函数时类型匹配的过程。
10.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
class Base {};
class Derived1 : public Base {};
class Derived2 : public Base {};
void func(Base& b);
void func(Derived1& d1);
void func(Derived2& d2);
int main() {
    Base* ptr1 = new Derived1();
    Base* ptr2 = new Derived2();
    // 调用func(Derived1&)通过ptr1
    if (Derived1* derived1Ptr = dynamic_cast<Derived1*>(ptr1)) {
        func(*derived1Ptr);
    }
    // 调用func(Derived2&)通过ptr2
    if (Derived2* derived2Ptr = dynamic_cast<Derived2*>(ptr2)) {
        func(*derived2Ptr);
    }
    delete ptr1;
    delete ptr2;
    return 0;
}

调用规则依据

  1. dynamic_castdynamic_cast用于在运行时进行类型转换,特别是用于安全地将基类指针或引用转换为派生类指针或引用。如果转换成功,dynamic_cast返回派生类指针(非空);如果转换失败(例如,对象的实际类型与目标类型不匹配),返回nullptr
  2. 函数重载解析:在C++中,函数重载解析是在编译时根据实参的静态类型来选择最合适的函数版本。由于ptr1ptr2的静态类型都是Base*,直接使用ptr1ptr2调用func函数会选择func(Base&)版本。为了调用特定派生类版本的func函数,需要先将指针转换为对应的派生类指针。

通过dynamic_cast进行类型转换,可以确保在运行时对象的实际类型与目标类型匹配,从而安全地调用正确的func函数版本。