两种代码方式:
class person { public: void f() { cout << "person.f()" << endl; } }; class woman :public person { public: void f() { cout << "woman.f() "<< endl; } }; void f(person *p) { p->f(); } int main() { person A; woman B; f(&B); return 0; }
执行结果如下,这是upcasting的例子。
person.f()
第二个例子:加上virtual
class person { public: virtual void f() { cout << "person.f()" << endl; } }; class woman :public person { public: virtual void f() { cout << "woman.f() "<< endl; } }; void f(person *p) { p->f(); } int main() { person A; woman B; f(&B); return 0; }
运行结果:woman.f()
这就是virtual的作用。
当使用指针或者引用的时候,不论指针或者引用的类型是父类还是子类,总是找到最精确的类型,去执行对应的成员函数。