2011-03-17 85 views
7
#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),它的工作原理。下面的代码有什么问题?这不是编译

+0

您正在使用什么编译器?它看起来像'gcc',但这是最近的代码吗?为什么你得到'$ test1.cpp:在函数'int main()':'中,即使你将main定义为void main()'?用gcc和vC++试用了 – Muggen 2011-03-17 08:09:49

+0

。从vC++编辑器复制代码,粘贴gcc输出。 – 2011-03-17 08:14:11

回答

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; 
    } 
}; 
+1

这是编译器特定的东西吗? – 2011-03-17 08:06:50

+1

它与使用。你能不能解释我在没有使用的情况下发生了什么? – 2011-03-17 08:08:12

+0

不应该int Display(int)无论如何都被派生出来,因为它被声明为public。 – 2011-03-17 08:10:07

3

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

为什么?

this explanation通过AndreyT

您可以通过使用using声明中那些隐藏的名字带来:

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

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

+2

他将main定义为void main(),但他如何获得'$ test1.cpp:在函数'int main()':'? – Muggen 2011-03-17 08:07:28

+5

@Muggen:将'main'声明为除int之外的其他类型的返回类型是非法的。这个特定的实现似乎只是忽略了这个错误,并将代码视为正确声明了“main”。 – 2011-03-17 08:11:18