鉴于以下代码示例,为什么重载的AbstractBaseClass::DoAThing( const char* )
在SomeEndClass
中作为实现重载纯抽象DoAThing( const char* const* )
方法的继承方法不可见?
class AbstractBaseClass
{
public:
virtual void DoAThing( const char* withThis ) {}
virtual void DoAThing( const char* const* withThat ) = 0;
AbstractBaseClass() {}
virtual ~AbstractBaseClass() {}
};
class SomeMiddlewareClass : public AbstractBaseClass
{
public:
void ThisIsCool() {}
SomeMiddlewareClass() {}
virtual ~SomeMiddlewareClass() {}
};
class SomeEndClass : public SomeMiddlewareClass
{
public:
void DoAThing( const char* const* withThat ) {}
SomeEndClass() {}
virtual ~SomeEndClass() {}
};
void SomeFunction()
{
SomeEndClass* myClass = new SomeEndClass();
myClass->DoAThing( "withThis" );
((SomeMiddlewareClass*)myClass)->DoAThing( "withThisToo" );
delete myClass;
}
当myClass->DoAThing( "withThis" );
行被接受时,编译器(和索引器)会在((SomeMiddlewareClass*)myClass)->DoAThing( "withThisToo" );
行产生以下错误。
无效的参数'候选者是:void DoAThing(const char * const *)
没有用于调用'SomeEndClass :: DoAThing(const char [9])'的匹配函数
SomeEndClass
不应继承AbstractBaseClass::DoAThing( const char* )
实施吗?我做错了什么?
答案 0 :(得分:7)
您的SomeEndClass::DoAThing()
函数不仅会覆盖从基类继承的函数,还会隐藏基类中该函数的其他重载。
您可以向using
班级添加SomeEndClass
声明:
using SomeMiddlewareClass::DoAThing;
因此:
class SomeEndClass : public SomeMiddlewareClass
{
public:
using SomeMiddlewareClass::DoAThing;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void DoAThing( const char* const* withThat ) {}
SomeEndClass() {}
virtual ~SomeEndClass() {}
};
使用此修复程序,您可以在此live example中看到您的程序正在编译。
答案 1 :(得分:6)
在您的基类中DoAThing
不仅仅是虚拟的,而是过载的。
派生类中的函数会覆盖其中一个重载,隐藏另一个。
然后你试图打电话给另一个,这是隐藏的。
您可以使用using
声明使隐藏函数在派生类中可见:
using Base::DoAThing;
...但是你是否应该是一个单独的(更复杂的)问题。