2013-07-03 37 views
2

我有一個實現Logger_IF C++類記錄儀具有定義一個純虛函數:C++的繼承問題,不能調用基類中定義公共職能

virtual void log(string message) = 0;

我想記錄器延伸到我自己帶有自己的界面的類。我已經調用了我的類SpecialLogger,它擴展了SpecialLogger_IF。 SpecialLogger_IF本身擴展了記錄器。我已經定義:

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

我SpecialLogger_IF類。據我瞭解,我應該仍然可以通過SpecialLogger_IF以及日誌(「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. 

有趣的是調用this->out(message)void log(string message, string extra)不工作,使一些繼承發生。

是我在做什麼正確和可能,或者我是否錯過了一些東西。

問候

+0

[在一個子類重載一個虛擬函數]的可能重複(http://stackoverflow.com/questions/8816794/overloading-a-virtual-function-in-a-child-class) –

回答

8

你的問題是,你的兩個參數的函數隱藏在基類中的一個參數的版本(這是由語言設計故意,因爲它阻止更多的問題比它引起)。

幸運的是,您可以使用using修復該問題:在您的兩個參數日誌函數的聲明下方,只需編寫using Logger::log;即可。

+0

非常好,已修復它。感謝您的幫助 :-) – Alastair

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; 
       ^