看下面函数
下面这个图解释,如何延迟绑定,产生多态:
class Base
{
public:
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
int base;
protected:
private:
};
//子类2,有1个虚函数重载
class Child2 : public Base
{
public:
virtual void f() { cout << "Child2::f" << endl; }
virtual void g2() { cout << "Child2::g2" << endl; }
virtual void h2() { cout << "Child2::h2" << endl; }
int child2;
protected:
private:
};
C++在编译的时候,用一张虚函数表记录类中的虚函数;在程序运行起来,分配内存时刻,
把对象内存模型的第一项指向虚函数表。
Child2类继承自Base类,虚函数表也继承,同时加入自己的虚函数。犹豫f()函数发生覆盖,所以
子类虚函数表中没有基类被覆盖掉的函数。
这时如果
Base *pbase = new Child2();
pbase->f();这里查子类虚函数表自然得到Child2::f(),但是只能访问子类虚函数表的前三项(),因为g1,h1不是基类
成员函数。
注:属性变量不会因为继承而被隐藏。
在这个例子中,如果
class Child2 : public Base
{
public:
virtual void f() { cout << "Child2::f" << endl; }
virtual void g2() { cout << "Child2::g2" << endl; }
virtual void h2() { cout << "Child2::h2" << endl; }
int base;
int child2;
protected:
private:
};
则内存模型中:
vfptr->...
int Base::base
int base
int child2