- 动态关联的原理:
- 在C++中,当类中定义虚函数时,每个包含虚函数的类及其派生类对象都有一个虚函数表(vtable)。虚函数表是一个函数指针数组,存储了类中虚函数的地址。
- 当通过指针或引用调用虚函数时,程序在运行时会根据指针或引用所指向对象的实际类型,去该对象对应的虚函数表中查找并调用相应的虚函数,这就是动态关联,也称为运行时多态。
- 代码示例:
#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "This is Base class." << std::endl;
}
};
class Derived : public Base {
public:
void print() override {
std::cout << "This is Derived class." << std::endl;
}
};
int main() {
Base* basePtr;
Derived derivedObj;
basePtr = &derivedObj;
basePtr->print(); // 通过指针调用虚函数
Base& baseRef = derivedObj;
baseRef.print(); // 通过引用调用虚函数
return 0;
}
- 运行时动态关联过程分析:
- 在上述代码中,
Base
类定义了一个虚函数print
。Derived
类从Base
类派生,并覆盖(override)了print
函数。
- 在
main
函数中,首先定义了一个Base
类型的指针basePtr
和一个Derived
类型的对象derivedObj
。
- 当
basePtr = &derivedObj;
时,basePtr
指向了derivedObj
。虽然basePtr
的静态类型是Base*
,但它实际指向的是Derived
类型的对象。
- 当调用
basePtr->print();
时,由于print
是虚函数,程序在运行时会根据basePtr
实际指向的Derived
类型对象,去Derived
类的虚函数表中查找print
函数的地址,并调用Derived
类中的print
函数,输出This is Derived class.
。
- 对于引用
Base& baseRef = derivedObj;
,同样的原理,baseRef
实际引用的是Derived
类型的对象,调用baseRef.print();
时,也会在运行时根据对象的实际类型(Derived
)去虚函数表中查找并调用Derived
类的print
函数。