在 C++ 中,静态绑定(静态多态)和动态绑定(动态多态)是关于函数调用的两种不同方式,这两种方式是由编译器和运行时系统来处理的。
静态绑定是指在编译时确定调用哪个函数,通常在编译时就能够确定函数的调用路径。这种绑定方式在编译期间就已经确定了,因此也被称为静态多态。静态绑定通常发生在以下情况下:
- 非虚函数调用:对于普通的非虚函数,编译器在编译时就可以确定调用哪个函数。
- 基类指针或引用调用派生类对象的成员函数,但该函数不是虚函数。
class Base {
public:
void foo() {
// Some code...
}
};
class Derived : public Base {
public:
void foo() {
// Some code specific to Derived...
}
};
int main() {
Base b;
Derived d;
Base* ptr = &b;
ptr->foo(); // 调用 Base::foo()
ptr = &d;
ptr->foo(); // 仍然调用 Base::foo(),因为 foo() 不是虚函数
return 0;
}
2. 动态绑定(动态多态)
动态绑定是指在运行时确定调用哪个函数,通常发生在虚函数的调用中。当基类指针或引用调用派生类对象的虚函数时,实际上会根据对象的实际类型来决定调用哪个函数,这种绑定方式直到运行时才能确定,因此也被称为动态多态。
class Base {
public:
virtual void foo() {
// Some code...
}
};
class Derived : public Base {
public:
void foo() override {
// Some code specific to Derived...
}
};
int main() {
Base b;
Derived d;
Base* ptr = &b;
ptr->foo(); // 调用 Base::foo()
ptr = &d;
ptr->foo(); // 调用 Derived::foo(),因为 foo() 是虚函数
return 0;
}
注意:C++ 中,虚函数的行为是动态绑定的,而虚函数的参数是静态绑定的。