面试题答案
一键面试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;
}
调用规则依据
dynamic_cast
:dynamic_cast
用于在运行时进行类型转换,特别是用于安全地将基类指针或引用转换为派生类指针或引用。如果转换成功,dynamic_cast
返回派生类指针(非空);如果转换失败(例如,对象的实际类型与目标类型不匹配),返回nullptr
。- 函数重载解析:在C++中,函数重载解析是在编译时根据实参的静态类型来选择最合适的函数版本。由于
ptr1
和ptr2
的静态类型都是Base*
,直接使用ptr1
或ptr2
调用func
函数会选择func(Base&)
版本。为了调用特定派生类版本的func
函数,需要先将指针转换为对应的派生类指针。
通过dynamic_cast
进行类型转换,可以确保在运行时对象的实际类型与目标类型匹配,从而安全地调用正确的func
函数版本。