3

1 つの純粋仮想関数が定義されている Logger_IF を実装する C++ クラス Logger があります。

virtual void log( string message ) = 0;

Logger を独自のインターフェイスで独自のクラスに拡張したいと思います。SpecialLogger_IF を拡張するクラス SpecialLogger を呼び出しました。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

問題は、2 つのパラメーター関数が基本クラスの 1 つのパラメーター バージョンを非表示にすることです (これは、原因よりも多くの問題を防ぐため、言語設計による意図的なものです)。

幸いなことに、次の方法で修正できusingます。2 つのパラメータ ログ関数の宣言のすぐ下に と記述しusing Logger::log;ます。

于 2013-07-03T16:44:28.687 に答える