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

时间:2013-04-26 18:06:51

标签: c++ inheritance abstract-class pure-virtual

鉴于以下代码示例,为什么重载的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* )实施吗?我做错了什么?

2 个答案:

答案 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;

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