3

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

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 以及 log("message", "extra") 调用 log("message") 但是我无法让它工作。

#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.

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

我正在做的事情是正确的和可能的,还是我错过了什么。

问候

4

2 回答 2

9

您的问题是您的两个参数函数在基类中隐藏了一个参数版本(这是语言设计有意为之的,因为它防止的问题多于引起的问题)。

幸运的是,您可以通过以下方式解决此问题using: 在您的两个参数日志函数声明的正下方,只需编写using Logger::log;

于 2013-07-03T16:44:28.687 回答
0

正如你所做的那样,我正在查看 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;
                  ^

在上面的代码上。

于 2014-06-23T17:26:13.363 回答