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

Jul*_*let 66 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;
}
Run Code Online (Sandbox Code Playgroud)

sth*_*sth 56

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

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

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

  • @sth很高兴知道这一点.但是,我可以说这是c ++的特征还是某种bug?这不会破坏继承的整个想法吗?只是问问而已.. (9认同)
  • @Anubis:该规则简化了名称查找.没有它,当需要解析成员函数的名称时,编译器需要遍历完整的继承树(在某些基类中可能存在函数的重载).使用该规则,一旦发现包含拟合名称的类,编译器就可以停止查看继承树的其余部分.程序员处于相同的情况.查看派生类,他可以确定将调用在那里定义的函数,而不必知道某个基类是否可能包含同名的不同函数. (4认同)

Amn*_*non 17

令人惊讶的是,这是标准行为.如果派生类声明了一个与基类定义的方法同名的方法,则派生类'方法会隐藏基类'one.

请参阅C++ FAQ


Dal*_*son 6

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

一种可能性:

void action( const char how )
{ 
  takeAction( &how ); 
}
void action( const char * how )
{
  takeAction(how);
}
virtual void takeAction(const char * how) = 0;
Run Code Online (Sandbox Code Playgroud)


Bhu*_*ant 5

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


归档时间:

查看次数:

37793 次

最近记录:

9 年,7 月 前