2013-10-21 107 views
1
class Player 
{ 

protected: 

    string type; 
    int rank; 

public: 

    virtual void printType() 
    { 
     cout<<"Calling Class Player, type is: general Player"<<endl; 
    } 

}; 


//class FootballPlayer: Derived from Player 

class FootballPlayer: public Player 
{ 

protected: 

public: 

    virtual void printRank() 
    { 
    cout<<"Calling Class FootballPlayer, Rank is: Football Player rank"<<endl; 

    } 

    void printType() 
    { 
    cout<<"Calling Class FootballPlayer, type is: Football Player"<<endl; 
    } 
}; 

class MaleFootballPlayer: public FootballPlayer 
{ 
public: 

    void printType() 
    { 
    cout<<"Calling Class MaleFootballPlayer, type is: Male Football Player"<<endl; 
    } 


    void printRank() 
    { 
    cout<<"Calling Class MaleFootballPlayer, Rank is: Male Player rank"<<endl; 

    } 

}; 

//class CricketPlayer: Derived from Player 

class CricketPlayer: public Player 
{ 

protected: 

public: 

    void printType() 
    { 
    cout<<"Calling Class CricketPlayer, type is: Cricket Player"<<endl; 
    } 
}; 


int main(int argc, const char * argv[]) 
{ 

    FootballPlayer fbplayer; 
    CricketPlayer crplayer; 
    MaleFootballPlayer malefbplayer; 


    FootballPlayer *fbplayerPtr; 
    fbplayerPtr=&malefbplayer; 
    fbplayerPtr->printType(); 


    return 0; 
} 

AS I运行程序,输出我得到的是,多级继承和多态

调用类MaleFootballPlayer,类型为:男子足球运动员身体素质

我创建一个基类指针(footballplayer)并分配给派生类对象(malefootballplayer),它应该调用属于基类的函数(因为它不是虚拟的),输出应该是'调用类FootBallPlayer,类型是:足球运动员'。

希望清除我的概念。

谢谢。

+0

'Player :: printType' _is_声明为'virtual'。 –

回答

0

由于MaleFootballPlayer对象的地址包含在FootballPlayer类型的指针中,并且在基本实现中声明为虚拟的printType()方法,因此这由派生类MaleFootballPlayer函数覆盖运行时。那就是为什么发生这种事。 虚拟表包含两个类的printType()函数的指针,但运行时选择了派生类printType()函数指针。

+0

更重要的是,'virtual'不会因为它不在派生类中重复而消失。 – arne

+0

@ arne,如果派生类中重复了“虚拟”关键字,该怎么办? – Subhajit

+0

这完全一样。如果函数在任何基类中声明为“虚拟”,则对于任何派生类和所有派生类而言,无论是否重复使用关键字“虚拟”,它都是虚拟的。 C++ 11提供了'final'关键字,可以阻止实现者进一步重载函数,但仍然会从基类指针或引用调用派生最多的实现。 – arne