none
C++基础中函数覆盖和重载问题 RRS feed

  • 问题

  • 有如下代码
    C/C++ code
    class Base{ public: virtual void print(){cout<<"base"<<endl;} virtual void print(int i){cout<<"base int "<<i<<endl;} }; class Derived : public Base{ public: virtual void print(){cout<<"derived"<<endl;} //virtual void print(int i){Base::print(i);} }; void main(int argc,char* argv[]){ Derived d; d.print(123); system("pause"); }

    在VS 2005编译环境下报错如下:
    “错误 7 error C2660: “Derived::print”: 函数不接受 1 个参数”
    我的子类Derived只覆盖了print()方法,没有覆盖print(int)方法,因此可以重用父类的print(int)方法呀,但是编译器发现不了该方法,为什么?
    2010年4月10日 6:11

答案

  • 首先函数选择顺序

    1 名字查找

    2 重载决议

    3 访问性检查

    名字查找按照从里到外的范围进行查找

    在你的例子里,

    Derived是最内层的范围

    在里面找到了对应的函数名字,则会忽略Base中的那个重载。所以带有参数的函数重载并没有进入到重载决议。

     

     

     

     


    麻烦把正确答案设为解答。
    2010年4月12日 1:46
    版主

全部回复

  • 这是我在csdn看到的一个帖,感觉很不理解,就给copy过来了,希望大家给解决一下!

    2010年4月10日 6:12
  • 这个涉及的C++的语法和C++的标准支持方面,对这方面其实不用深究。

    具体原因也没什么好分析的,标准就是这样,越分析越乱。


    0xBAADF00D
    2010年4月10日 12:34
    版主
  • 首先函数选择顺序

    1 名字查找

    2 重载决议

    3 访问性检查

    名字查找按照从里到外的范围进行查找

    在你的例子里,

    Derived是最内层的范围

    在里面找到了对应的函数名字,则会忽略Base中的那个重载。所以带有参数的函数重载并没有进入到重载决议。

     

     

     

     


    麻烦把正确答案设为解答。
    2010年4月12日 1:46
    版主
  • 详情参见Exceptional C++
    麻烦把正确答案设为解答。
    2010年4月12日 1:47
    版主