这里写了一个测试模拟对象内存模型中的虚函数调用机制(业界称动态绑定,Dynamic Binding)。
#include <iostream>
using namespace std;
struct TMP {
int a;
int b;
int c;
TMP() {
a = 1; b = 1; c = 1;
}
int operator*() const{
return a + b + c;
}
};
TMP t1, t2, t3;
TMP arr[] = {t1, t2, t3};
class A {
public:
A(int _a = 0, int _b = 0, TMP* _vptr = arr)
: a(_a), b(_b), vptr(_vptr) {}
void foo() {
cout << "This is a test" << endl;
}
TMP* getV() {
return vptr;
}
private:
int a;
int b;
TMP* vptr;
};
int main() {
A a;
cout << *a.getV()[0] << "\n\n";
system("pause");
return 0;
}
同样,C语言的有个叫静态绑定的东西,被编译器解释为 call XXX,编译时期就已经确定了具体调用的函数。
而动态绑定编译时候是确定不了的,具体要看上图中的 p 具体指向的什么东西,所以需要到运行时才能确定具体调用哪个函数,必然要造成额外开销。
面向对象设计中利用继承和虚函数的动态绑定实现多态写了一个测试模拟对象内存模型中的虚函数调用机制(业界称动态绑定,Dynamic Binding)。
而动态绑定编译时候是确定不了的,具体要看上图中的 p 具体指向的什么东西,所以需要到运行时才能确定具体调用哪个函数,必然要造成额外开销。面向对象设计中利用继承和虚函数的动态绑定实现多态(polymorphism,即多种不同的形态)。
下图很形象: