虚函数(virtual function) 在 基函数(base function) 和 派生函数(derived function) 之间可以覆写(override);
如果派生函数有与虚函数同名的函数, 则会隐藏虚函数, 但是虚函数还会在;
由于派生对象和基对象可以转换, 可以只使用基对象部分; 派生对象的虚函数会覆写基对象的虚函数;
代码:
/* * cppprimer.cpp * * Created on: 2013.11.13 * Author: Caroline */ /*eclipse cdt, gcc 4.7.1*/ #include <iostream> class Base { public: virtual int fcn () { //虚函数 std::cout << "This base class [int fcn()]. " << std::endl; return 0; } }; /*更多精彩内容:.*/ class D1 : public Base { public: int fcn (int) { //与基类的参数不同, 不是重载虚函数 std::cout << "This derived 1 class [int fcn(int)]. " << std::endl; return 0; } virtual void f2 () { //虚函数 std::cout << "This derived 1 class [f2()]. " << std::endl; } }; class D2 : public D1 { public: int fcn (int) { //隐藏基函数的同名函数 std::cout << "This derived 2 class [int fcn(int)]. " << std::endl; return 0; } int fcn () { //重载基类的虚函数 std::cout << "This derived 2 class [int fcn()]. " << std::endl; return 0; } void f2 () { std::cout << "This derived 2 class [f2()]. " << std::endl; } }; int main (void) { Base bobj; D1 d1obj; D2 d2obj; Base *bp1 = &bobj, *bp2 = &d1obj, *bp3 = &d2obj; bp1->fcn(); bp2->fcn(); //未找到重载版本, 则使用基函数版本 bp3->fcn(); //D2使用的是重载版本 D1 *d1p = &d1obj; D2 *d2p = &d2obj; d1p->f2(); d2p->f2(); D1 *p1 = &d2obj; D2 *p2 = &d2obj; p1->fcn(10); p2->fcn(10); return 0; }
输出:
This base class [int fcn()]. This base class [int fcn()]. This derived 2 class [int fcn()]. This derived 1 class [f2()]. This derived 2 class [f2()]. This derived 1 class [int fcn(int)]. This derived 2 class [int fcn(int)].