c++ 子類切勿重新定義父類 non-virtual函數


子類如果重新定義了父類的non-virtual函數則不會有多態效果。

為方便描述,這里的方法和繼承方式都用public。至於原因嘛,你懂的!

1:子類直接繼承父類方法

class BaseOption
{
public:
    void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}



class SubOption :
    public BaseOption
{
};

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;

 SubOption *pSub = &obj;

 pBase->Function();
 
pSub->Function();
}

輸出:

"BaseOption::Function()"
"BaseOption::Function()"

這里使用BaseOption 和SubOption 調用Function都能調進BaseOption::Function();

2:為了實現多態效果,把父類Function()改為virtual,在子類中重新實現

class BaseOption
{
public:
    virtual void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}



class SubOption :
    public BaseOption
{
public:
       void Function();
};

void SubOption::Function()
{
  cout<<"SubOption::Function()"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;

 SubOption *pSub = &obj;

  pBase->Function();

 pSub->Function();
}

這就是我們常說的多態。

輸出:
"SubOption::Function()"
"SubOption::Function()"

3:子類直接重新定義父類non-virtual方法,這背時的做法,在這種情況下就沒有了多態屬性,至於這種設計方法的弊端,沒得說。

 

 

class BaseOption
{
public:
    void Function();
};

void BaseOption::Function()
{
    cout<<"BaseOption::Function()"<<endl;
}



class SubOption :
    public BaseOption
{
public:
       void Function();
};

void SubOption::Function()
{
  cout<<"SubOption::Function()"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    SubOption obj;
    BaseOption *pBase = &obj;
    SubOption *pSub = &obj;
    pBase->Function();
    pSub->Function();
}

 

輸出:
BaseOption::Function()

SubOption::Function()

雖然實例對象時SubOption obj,但在調用時候 由BaseOption指針pBase會調進BaseOption中,這也是哦,SubOption is-a BaseOption .

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM