以下代码有什么问题?它没有编译

时间:2011-03-17 08:01:55

标签: c++

#include <iostream> 
#include <vector>
using namespace std;

class Base
{
public:
      void Display( void )
      {
            cout<<"Base display"<<endl;
      }

      int Display( int a )
      {
            cout<<"Base int display"<<endl;
            return 0;
      }

};

class Derived : public Base
{
public:

      void Display( void )
      {
            cout<<"Derived display"<<endl;
      }
};


void main()
{
   Derived obj;
   obj.Display();  
   obj.Display( 10 );
}

$test1.cpp: In function ‘int main()’:  
test1.cpp:35: error: no matching function for call to ‘Derived::Display(int)’  
test1.cpp:24: note: candidates are: void Derived::Display()

在评论obj.Display(10)时,它有效。

3 个答案:

答案 0 :(得分:3)

您需要使用using声明。类f 中名为X的成员函数隐藏 f基类中名为X的所有其他成员}。

<强>为什么吗

阅读AndreyT的this explanation

您可以使用using声明来引入这些隐藏的名称:

using Base::Display是你需要包含在派生类中的。

此外void main()是非标准的。使用int main()

答案 1 :(得分:2)

你需要放置 -

using Base::Display ; // in Derived class

如果在Derived类中匹配方法名称,编译器将不会查找Base类。因此,要避免此行为,请放置using Base::Display;。然后,如果有任何方法可以将Base作为int的参数,编译器将查看Display类。

class Derived : public Base
{
    public:
    using Base::Display ;
    void Display( void )
    {
        cout<<"Derived display"<<endl;
    }
};

答案 2 :(得分:2)

您通过在派生类中使用相同名称创建函数来屏蔽原始函数定义:http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.8