C++中虚函数(virtual function) 的 使用范围

 虚函数(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)].

 








































































































































































































































白癜风在线咨询


转载请注明:http://www.nydjfy.com/jbjj/jbjj/5.html