#include<iostream>
class CBase
{
public:
virtual void PrintData(int nData = 111);
};
void CBase::PrintData(int nData /* = 111 */)
{
printf("CBase::PrintData, nData = %d\n", nData);
}
class CDerived : public CBase
{
public:
void PrintData(int nData = 222);
};
void CDerived::PrintData(int nData /* = 222 */)
{
printf("CDerived::PrintData, nData = %d\n", nData);
}
int main()
{
CDerived oCDerived;
CBase* pCBase = &oCDerived;
pCBase->PrintData();
(*pCBase).PrintData();
oCDerived.PrintData();
return 0;
}
run and print:
CDerived::PrintData,nData = 111
CDerived::PrintData,nData = 111
CDerived::PrintData, nData = 222
我很抱歉因为我想用自己的代码进行测试而弄错了。 有我困惑的代码。 正如所料,pCBase是指向派生类对象oCDerived的基础主题的指针,因此通过pCBase指针调用PrintData()等于通过派生类对象调用PrintData()覆盖它。它应该依次打印222 222和222。
答案 0 :(得分:2)
覆盖方法时,在参数列表之后添加上下文关键字override
,如下所示:
void prinf()override{cout<<"bbb"<<endl;}
如果您这样做,当您的基类有print
时,如果您的派生输入拼写错误prinf
,则会出现错误。
这也解释了你的症状。
在代码中的任何位置将prinf
重命名为print
。