C++继承问题,无法调用基类中定义的公共函数

C++ inheritance issue, cannot call public function defined in base class

本文关键字:定义 函数 基类 调用 问题 继承 C++      更新时间:2023-10-16

我有一个C++类Logger,它实现Logger_IF,它定义了一个纯虚拟函数:

virtual void log( string message ) = 0;

我想用Logger自己的接口将它扩展到我自己的类。我已经将我的类称为SpecialLogger,它扩展了SpecialLogger_IF。SpecialLogger_IF本身扩展了Logger。我已经定义:

virtual void log( string message, string extra ) = 0;

在我的SpecialLogger_IF类上。据我所知,我仍然可以通过SpecialLogger_IF调用日志("message")以及日志("message"、"extra"),但我无法使其工作。

#include <iostream>
using namespace std;
class Logger_IF
{
    public:
        virtual void log( string message ) = 0;
        virtual ~Logger_IF() {};
};
class Logger : public Logger_IF
{
    public:
        void log( string message )
        {
            this->out( message );
        }
    protected:
        void out( string message )
        {
            cout << "LOG: " << message << endl;
        }
};
class SpecialLogger_IF : public Logger
{
    public:
        virtual void log( string message, string extra ) = 0;
        virtual ~SpecialLogger_IF() {};
};
class SpecialLogger : public SpecialLogger_IF
{
    public:     
        void log( string message, string extra )
        {
            this->out( message );
            this->extra( extra );
        }
    private:
        void extra( string extra )
        {
            cout << "^ EXTRA: " << extra << endl;
        }
};
int main( int argc, char *argv[] )
{
    Logger_IF* logger = new Logger();
    logger->log( "message" );
    delete logger;
    SpecialLogger_IF* spLogger = new SpecialLogger();
    spLogger->log( "message" );
    spLogger->log( "message", "extra" );
    delete spLogger;
}

我得到以下错误:

testing.cpp:62:27: error: too few arguments to function call, expected 2, have 1
        spLogger->log( "message" );
        ~~~~~~~~~~~~~            ^
testing.cpp:34:3: note: 'log' declared here
                virtual void log( string message, string extra ) = 0;
                ^
1 error generated.

有趣的是,在void log( string message, string extra )内部调用this->out( message )确实有效,因此正在进行一些继承。

我所做的是正确和可能的,还是我遗漏了什么。

问候

Al

您的问题是,您的双参数函数在基类中隐藏了单参数版本(这是语言设计有意为之,因为它可以防止更多的问题)。

幸运的是,您可以使用using来修复此问题:在双参数日志函数声明的正下方,只需编写using Logger::log;

正如您所做的,我浏览了gcc手册页,对于这个确切的问题有一个方便的警告:

-Woverloaded-virtual

它返回

test.cpp:17:14: warning: ‘virtual void Logger::log(std::string)’ was hidden [-Woverloaded-virtual]
     void log( string message )
          ^
test.cpp:34:22: warning:   by ‘virtual void SpecialLogger_IF::log(std::string, std::string)’ [-Woverloaded-virtual]
     virtual void log( string message, string extra ) = 0;
                  ^

关于上述代码。

Al