我写了下面的代码来解释我的问题。如果我对第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;
}
答案 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
关键字。