虚函数表
class Base {
public:
virtual voif f() {
cout << "Base::f" << endl;
}
virtual void g() {
}
virtual void h() {
}
};
在上面这个类中, 虚函数表是这样设置的
一般继承(无虚函数覆盖)
对于这样的继承关系, 虚函数表的结构是
从上面两张图我们可以看到两点
1. 虚函数按照其声明顺序放在虚函数表中
2. 父亲的虚函数放在孩子的虚函数之前
一般继承(有虚函数覆盖)
从上面两张图中, 我们可以看到两点
1. 覆盖的 f() 函数被放到虚函数原来父函数的位置
2. 其他函数的相对位置不变
多重继承(无虚函数覆盖)
可以看出
1. 每个父类都有自己的虚函数表
2. 子类的成员函数被放到第一个虚函数表
多重继承(有虚函数覆盖)
有了这种表, 我们便可以实现
Derive d;
Base1 *b1 = &d;
Base2 *b2 = &d;
Base3 *b3 = &d;
b1->f(); //Derive::f()
b2->f(); //Derive::f()
b3->f(); //Derive::f()
b1->g(); //Base1::g()
b2->g(); //Base2::g()
b3->g(); //Base3::g()
转自: http://blog.csdn.net/haoel/article/details/1948051