2015-06-24 81 views
2

我有這個簡單的類(Alpha)和他的抽象類(Beta)。我無法將Alpha(Beta)對象傳遞給overwrite()函數,因爲抽象類不能處理自我類型對象。C++ - 「不能聲明參數'匿名'爲抽象類型'

#include <iostream> 
using std::cout; 
using std::endl; 
using std::ostream; 

class Beta { 
    public: 
     virtual int read() const = 0; 
     virtual void write(int) = 0; 
     virtual void overwrite(Beta) = 0; // <-- This is the problem 
}; 

class Alpha : public Beta { 
    public: 
     int read () const; 
     void write (int); 
     void overwrite(Alpha); 
    private: 
     int value; 
}; 

int Alpha::read() const { 
    return value; 
} 
void Alpha::write(int v) { 
    value = v; 
} 
void Alpha::overwrite(Alpha A) { 
    value = A.value; 
} 

int main() { 
    Alpha A, B; 
    A.write(8); 
    B.write(6); 

    cout << "A: " << A.read() << endl; // 8 
    cout << "B: " << B.read() << endl; // 6 

    A.overwrite(B); 

    cout << endl << "A: " << A.read(); // 6 
    return 0; 
} 

它給我[Error] cannot declare parameter '<anonymous>' to be of abstract type 'Beta'。如何處理它?這是一個小代碼示例,但我需要解決這個問題,因爲我不能重載運算符並正確聲明這種類型的函數。

回答

3

Beta類是抽象的,不能實例化。

你的函數簽名需要一個抽象類的實例化。

嘗試通過以引用或指針:

void overwrite(Beta& b); 
void overwrite(Beta * b); 
+0

我做到了,它顯示了一個不同的錯誤: 無法將變量'A'聲明爲抽象類型'Alpha',因爲以下虛擬函數在'Alpha'中是純的:virtual void Beta :: overwrite(Beta& – AndroidGuy

+0

@AndroidGuy如果你沒有改變'Alpha :: overwrite'的簽名,那麼我就告訴你會發生什麼。 – CoryKramer

+0

對不起,我沒有得到它。 – AndroidGuy

1

問題是您的overwrite方法是純虛擬的和不被覆蓋。這種方法在Beta

virtual void overwrite(Beta) = 0; 

以下簽名Alpha它是

void overwrite(Alpha); 

這些相同功能的簽名。你可以做的是傳遞一個參考,並投它,例如

class Beta { 
    public: 
     virtual int read() const = 0; 
     virtual void write(int) = 0; 
     virtual void overwrite(Beta&) = 0; 
}; 

class Alpha : public Beta { 
    public: 
     int read () const; 
     void write (int); 
     void overwrite(Beta&) override; // Note the override 
    private: 
     int value; 
}; 

void Alpha::overwrite(Beta& A){ 
    value = static_cast<Alpha&>(A).value; 
} 

這將產生輸出(live demo):我在Alpha添加關鍵字override在函數聲明之後

A: 8 
B: 6 

A: 6 

注。如果你在參數仍然是Alpha時這樣做了,那麼你的代碼就不會因爲這個原因而編譯。

+0

這是一個很好的答案,但在我的情況下,不應該觸及Alpha類,特別是在提及其內部的抽象類的情況下。如果僅通過觸及抽象類(Beta)就可以解決問題,這將非常棒。 – AndroidGuy

+0

然後你是SOL。如果您無法在派生類中更改「overwrite」的簽名以匹配基類中的**純虛函數**,則無法編譯任何派生類。 – CoryKramer