为什么抽象类的实现看不到重载纯虚函数
Why does implementation of abstract class not see overloaded pure virtual function?
给出以下代码示例,为什么重载的AbstractBaseClass::DoAThing( const char* )
在实现重载的纯抽象DoAThing( const char* const* )
方法的SomeEndClass
中不可见作为继承方法?
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* )
的实现吗?我做错了什么?
您的SomeEndClass::DoAThing()
函数不仅覆盖从基类继承的函数,而且隐藏了基类中该函数的其他重载。
你可以在你的SomeEndClass
类中添加一个using
声明:
using SomeMiddlewareClass::DoAThing;
因此:class SomeEndClass : public SomeMiddlewareClass
{
public:
using SomeMiddlewareClass::DoAThing;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
void DoAThing( const char* const* withThat ) {}
SomeEndClass() {}
virtual ~SomeEndClass() {}
};
通过此修复,您可以看到您的程序在中编译。
在您的基类中,DoAThing
不仅是虚拟的,而且是重载的。
派生类中的函数覆盖其中一个重载,而隐藏另一个。
然后你试图打电话给另一个,这是隐藏的。
您可以通过using
声明使隐藏函数在派生类中可见:
using Base::DoAThing;
…但你是否应该是一个单独的(更复杂的)问题。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载