为什么我应该使用“using”关键字来访问我的基类方法?

时间:2009-12-13 15:32:46

标签: c++ oop inheritance using

我写了下面的代码来解释我的问题。如果我对第11行(使用关键字“using”)进行注释,则编译器不会编译该文件并显示以下错误:invalid conversion from 'char' to 'const char*'。似乎没有看到void action(char)类中Parent类的方法Son

为什么编译器会以这种方式运行?或者我做错了什么?

class Parent
{
    public:
        virtual void action( const char how ){ this->action( &how ); }
        virtual void action( const char * how ) = 0;
};

class Son : public Parent
{
    public:
        using Parent::action; // Why should i write this line?
        void action( const char * how ){ printf( "Action: %c\n", *how ); }
};

int main( int argc, char** argv )
{
    Son s = Son();
    s.action( 'a' );
    return 0;
}

4 个答案:

答案 0 :(得分:54)

派生类中声明的action隐藏了基类中声明的action。如果在action对象上使用Son,编译器将搜索Son中声明的方法,找到一个名为action的对象,并使用它。它不会继续在基类的方法中搜索,因为它已经找到了匹配的名称。

然后该方法与调用的参数不匹配,并且您收到错误。

有关此主题的更多说明,另请参阅C++ FAQ

答案 1 :(得分:16)

令人惊讶的是,这是标准行为。如果派生类声明的方法与基类定义的方法同名,则派生类的方法会将基类隐藏为“1”。

请参阅C++ FAQ

答案 2 :(得分:6)

注意事项:在这种情况下需要使用“使用”是一个红色标记,您的代码可能会让其他开发人员感到困惑(毕竟它使编译器感到困惑!)。您可能应该重命名这两种方法中的一种,以便区别于其他程序员。

一种可能性:

void action( const char how )
{ 
  takeAction( &how ); 
}
void action( const char * how )
{
  takeAction(how);
}
virtual void takeAction(const char * how) = 0;

答案 3 :(得分:5)

如果在派生类中重新定义了任何重载函数,则隐藏基类中的所有重载函数。 包含这两种功能的一种方法是避免类中的函数重载。要么 您可以使用using关键字。