为什么一些虚函数动态有界,但有些不是?

时间:2017-12-19 04:23:24

标签: c++

    #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。

1 个答案:

答案 0 :(得分:2)

覆盖方法时,在参数列表之后添加上下文关键字override,如下所示:

    void prinf()override{cout<<"bbb"<<endl;}

如果您这样做,当您的基类有print时,如果您的派生输入拼写错误prinf,则会出现错误。

这也解释了你的症状。

在代码中的任何位置将prinf重命名为print