关于c++的内存布局
比如我们写这样一个简单的代码
class Parent
{
public:
Parent(){}
~Parent(){}
void Say() { cout << "Parent" << endl; }
protected:
private:
};
class Son:public Parent
{
public:
Son() {}
~Son() {}
void Say() { cout << "Son" << endl; }
protected:
private:
};
int main()
{
Parent *p = new Son;
p->Say();
getchar();
return 0;
}
很显然这个程序的输出是 Parent 因为我们用基类的指针指向超类的时候,因为是普通成员函数所以父类指针只能访问到父类的存储空间。这时候我们调用 Say 方法就只会调用父类的方法。
虚函数
然后我们只要在稍微改动下代码
class Parent
{
public:
Parent(){}
~Parent(){}
virtual void Say() { cout << "Parent" << endl; }
protected:
private:
};
结果就完全不一样了,因为加上了虚函数的关键字后,只要子类进行重载不管写没写 virtual 关键字都是会对应在续表中生成虚函数。所以这时候即使是父类指针指向子类的实例,通过虚函数重载虚函数表将被覆盖的话调用的依然是子类的方法,输出就是 Son 。