MST

星途 面试题库

面试题:C++函数重载与虚函数调用机制深度剖析

在C++中,多重继承和虚继承可能会影响函数重载与虚函数的调用机制。请描述在以下复杂继承结构中函数调用的解析过程: ```cpp class A { public: virtual void f() { std::cout << "A::f" << std::endl; } }; class B : virtual public A { public: void f(int i) { std::cout << "B::f(int)" << std::endl; } }; class C : virtual public A { public: void f(double d) { std::cout << "C::f(double)" << std::endl; } }; class D : public B, public C { public: void f() override { std::cout << "D::f" << std::endl; } }; ``` 当`D d; A* pa = &d; pa->f();`执行时,详细说明编译器如何确定调用哪个`f`函数。同时,如果是`B* pb = &d; pb->f(5);`,又会发生什么,解释其原理。
49.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. D d; A* pa = &d; pa->f();执行时:
    • 首先,pa的静态类型是A*,指向的动态类型是D类型的对象d
    • 由于f函数在A类中被声明为虚函数,C++的动态绑定机制会起作用。
    • 编译器会根据pa所指向对象的实际类型(即D类型)来查找f函数的实现。
    • D类重写了A类的f函数,所以最终会调用D::f,输出D::f
  2. B* pb = &d; pb->f(5);执行时:
    • pb的静态类型是B*,指向的动态类型是D类型的对象d
    • B类的作用域中查找f函数,找到了void f(int i)。这里不会触发动态绑定,因为f(int i)B类中不是虚函数。
    • 虽然D类继承自B,但由于f(int i)不是虚函数,不会根据对象的动态类型D来查找函数,而是直接调用B::f(int),输出B::f(int)