4

给定下面的代码示例,为什么在实现重载的纯抽象方法中,重载AbstractBaseClass::DoAThing( const char* )作为继承方法不可见?SomeEndClassDoAThing( 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])'</p>

不应该SomeEndClass继承AbstractBaseClass::DoAThing( const char* )实现吗?我究竟做错了什么?

4

2 回答 2

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() {}
};

通过此修复,您可以在此实时示例中看到您的程序正在编译。

于 2013-04-26T18:09:09.497 回答
6

在您的基类DoAThing中不仅是虚拟的,而且是重载的。

派生类中的函数覆盖其中一个重载并隐藏另一个。

然后你试图打电话给另一个,它是隐藏的。

您可以通过声明使隐藏函数在派生类中可见using

using Base::DoAThing;

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

于 2013-04-26T18:09:56.287 回答