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

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

为什么编译器这样做? 还是我做错了什么?

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

在派生类中声明的action隐藏了在基类中声明的action 。 如果在Son对象上使用action ,编译器将在Son声明的方法中search,find一个名为action ,然后使用它。 它不会继续search基类的方法,因为它已经find了匹配的名字。

然后,该方法不匹配的调用参数,你会得到一个错误。

有关此主题的更多解释,另请参阅C ++ FAQ 。

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

参见C ++ FAQ

需要注意的是:在这种情况下使用“使用”的需要是一个红旗,你的代码可能会让其他开发者感到困惑(毕竟它让编译器感到困惑!)。 很可能你应该重命名这两种方法中的一种,以便与其他程序员区分清楚。

一种可能性:

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

如果在派生类中重载了任何重载函数,那么隐藏了基类中的所有重载函数。 包含这两个function的一种方法是避免类中的函数重载。 或者您可以使用using关键字。