2011-02-16 367 views
7

當對抽象類有引用時,這意味着什麼? 我在代碼中找到它,我無法理解它。對抽象類的引用

我認爲抽象類不能被實例化。你怎麼能給它一個參考?

+2

這個問題太含糊。發佈代碼示例並解釋它爲什麼會讓您感到困惑。 – aschepler 2011-02-16 16:28:19

+0

這是否意味着在另一端可能有任何具體的子類? – Piskvor 2011-02-16 16:30:32

回答

13

對抽象類的引用就像是指向抽象類的指針:它需要引用抽象類的某個非抽象子類的對象。您可以使用類似這樣的引用來使用.語法在引用的類上調用虛擬方法,方式類似於指向Java中接口的指針。

6

抽象類被設計爲派生自。 Liskov替換原則大致指出,使用從抽象基礎派生的類型的抽象部分的任何內容都應該以多態方式使用基礎同樣適用。這意味着應該使用參考或指向基地的指針。

+3

+1將其鏈接到Liskov替代原則。這些有價值的提示指導新手去探索軟件設計/編程的更深層領域,從而在相鄰的隔間裏更有能力的同事:) – 2011-02-16 17:20:31

3
class Abstract 
{ 
public: 
    virtual void foo() = 0; 
}; 

class Implementation : public Abstract 
{ 
public: 
    void foo() { std::cout << "Foo!" << std::endl; } 
}; 

void call_foo(Abstract& obj) { obj.foo(); } 

int main() 
{ 
    Abstract *bar = new Implementation(); 

    call_foo(*bar); 

    delete bar; 
} 

barpointer到的抽象類。它可以使用*運算符取消引用並作爲reference傳入call_foo,因爲那是call_foo要求的內容(Abstract*將要求指針,而Abstract&要求引用)。

在上述中,參照抽象類被傳遞,並且當foo()使用.符號(而不是指針->符號)調用,它打印Foo!,因爲那是Implementation做什麼。

希望這會有所幫助。

2

在C++中的引用表現(幾乎)像隱藏的指針。特別是,您可以使用指針獲得相同的多態行爲,您可以通過引用來實現它。也就是說,下面是(幾乎)等效的

int *i = &a; 
int &j = a; 

假設a是在前面幾行中定義的整數。參考文獻j出現後,與(* i)的出現完全等價。主要區別在於引用不會給你內存管理帶來的痛苦,而指針則會(你有責任處理新的和刪除的內容)。另外,一個指針不必指向某個東西,而一個引用不能指向任何東西。除此之外,你可以認爲他們的行爲是一樣的。

因此,抽象對象的引用是絕對合法的。你會經常在函數簽名中找到它,其中多態行爲可以通過引用或指針來實現。但是參考文獻得到更輕的語法,如下面的代碼段示出了

A a; 
A* ptr = &a; 
A& ref = a; 
ref(); 
ptr->operator()(); 
(*ptr)(); 

假設類A重載operator()