2014-04-01 94 views
2

这是一个非常基本的问题,但我的C++技能有点生疏...重载函数

我有了一个成员函数,有3个参数,如基类:

class MyBaseClass 
{ 
public: 
    int func(int a, char b, int c); 
}; 

和重载用1参数版本该功能的派生类,例如:

class MyDerivedClass : public MyBaseClass 
{ 
public: 
    int func(float a); 
}; 

当我尝试调用从基类的功能的派生类的对象上, 喜欢这个:

MyDerivedClass d; 
d.func(1, 'a', 0); 

编译器抱怨说MyDerivedClass::func() does not take 3 arguments。这是真的,但我不应该通过派生类的对象访问基类函数吗?

我在做什么错?

+2

看到这个主题? http://stackoverflow.com/questions/1896830/why-should-i-use-the-using-keyword-to-access-my-base-class-method – taocp

回答

6

MyDerivedClass::func正在隐藏名称MyBaseClass::func。你可以用using声明解决这个问题:

class MyDerivedClass : public MyBaseClass 
{ 
public: 
    using MyBaseClass::func; 
    int func(float a); 
}; 
+0

我知道它必须是简单的东西。自从我掸掉我的C++帽子已经很长时间了。我从来没有见过'使用'关键字 - 是新的? –

+0

@JeffLoughlin'使用'从一开始就一直存在。它可以在C++ 11中做更多的事情,但上面显示的用法是老派。 – juanchopanza

+0

大约12年前,我曾经是一个C-> C++转换,然后大约3年后又回来了,所以我想我从来没有机会在我短暂的C++经验中学习'使用'。感谢您的解释。 –

1

你可能打算申报方法MyBaseClass::func()virtual

但是,如果你真的想实现

当我尝试从基类调用函数 派生类的对象,就像这样

那么,你可以尝试

MyDerivedClass d; 
d.MyDerivedClass::func(3.14f); 

这编译和作品,但似乎并没有很好的设计。

编译器抱怨MyDerivedClass::func()用不了3个 参数

这的确是真实的,每类定义,MyDerivedClass :: FUNC()只有一个参数。

+0

这不会改变任何东西(除非它可能对gcc产生有用的警告)。 – juanchopanza

0

添加“using Class :: func;”在MyDerivedClass中。

class MyDerivedClass : public MyBaseClass 
    { 
    public: 
     using MyBaseClass::func; 
     int func(float a); 
    };