为什么抽象类的实现看不到重载纯虚函数

Why does implementation of abstract class not see overloaded pure virtual function?

本文关键字:函数 重载 看不到 抽象类 实现 为什么      更新时间:2023-10-16

给出以下代码示例,为什么重载的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;

…但你是否应该是一个单独的(更复杂的)问题。