标签:
那些被 virtual 修饰的成员函数,就是虚函数。
虚函数的作用同函数重载一样,也是为了实现多态性。
以下示例中 A 和 B 定义了相同接口,分别调用时,输出不同。
class A { public: void print() { cout << "a" << endl; } }; class B: public A { public: void print() { cout << "b" << endl; } }; int main() { A a; B b; a.print(); b.print(); return 0; }
但以上并不是多态,多态还有一个关键之处就是:一切用指向基类的指针或引用来操作对象。
把以上代码的 main() 函数改一下:
int main() { A a; B b; A *pa = &a; A *pb = &b; pa->print(); pb->print(); return 0; }
结果如下:
问题来了,pb 明明指向的是 class B 的对象,但调用的却是 class A 的 print() 函数。
这不是我们所期望的结果,解决这个问题就需要用到虚函数。修改A、B的定义如下:
class A { public: virtual void print() { cout << "this is a" << endl; } }; class B: public A { public: void print() { cout << "this is b" << endl; } };
结果如下:
类A的成员函数 print() 已经成了虚函数,并且类B的成员函数 print() 也成了虚函数,当基类的成员函数高为 virtual,
其派生类的同名函数也会自动变成虚函数(不用再加 virtual修饰)。所以类B的 print() 也成了虚函数。
总之,指向基类的指针在操作它的多态对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。
而不是根据自身类对象的类型调用相应的函数。
标签:
原文地址:http://www.cnblogs.com/aqing1987/p/4594864.html