面试题答案
一键面试#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;
}
};
不同调用方式下的行为及原因
-
静态绑定(
Base::print()
):- 行为:无论
callPrint
函数是由Base
对象还是Derived
对象调用,都会调用Base
类的print
函数。 - 原因:使用类名限定符
Base::
明确指定了调用Base
类的print
函数,这是一种静态绑定方式,编译器在编译时就确定了调用的函数,与对象的实际类型无关。
- 行为:无论
-
动态绑定(
this->print()
):- 行为:如果
callPrint
函数由Base
对象调用,会调用Base
类的print
函数;如果由Derived
对象调用,会调用Derived
类的print
函数。 - 原因:通过
this
指针调用虚函数print
,这是动态绑定方式。在运行时,根据this
指针所指向对象的实际类型(Base
或Derived
)来决定调用哪个类的print
函数。虚函数机制使得编译器在运行时能够根据对象的实际类型来确定要调用的函数版本,实现了多态性。
- 行为:如果
你可以通过以下方式测试代码:
int main() {
Base b;
b.callPrint();
Derived d;
d.callPrint();
return 0;
}
在main
函数中分别创建Base
和Derived
对象,并调用callPrint
函数,可以看到不同的输出结果,验证上述分析。