對抽象類的引用
回答
對抽象類的引用就像是指向抽象類的指針:它需要引用抽象類的某個非抽象子類的對象。您可以使用類似這樣的引用來使用.
語法在引用的類上調用虛擬方法,方式類似於指向Java中接口的指針。
抽象類被設計爲派生自。 Liskov替換原則大致指出,使用從抽象基礎派生的類型的抽象部分的任何內容都應該以多態方式使用基礎同樣適用。這意味着應該使用參考或指向基地的指針。
+1將其鏈接到Liskov替代原則。這些有價值的提示指導新手去探索軟件設計/編程的更深層領域,從而在相鄰的隔間裏更有能力的同事:) – 2011-02-16 17:20:31
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;
}
bar
是pointer
到的抽象類。它可以使用*
運算符取消引用並作爲reference
傳入call_foo
,因爲那是call_foo
要求的內容(Abstract*
將要求指針,而Abstract&
要求引用)。
在上述中,參照抽象類被傳遞,並且當foo()
使用.
符號(而不是指針->
符號)調用,它打印Foo!
,因爲那是Implementation
做什麼。
希望這會有所幫助。
在C++中的引用表現(幾乎)像隱藏的指針。特別是,您可以使用指針獲得相同的多態行爲,您可以通過引用來實現它。也就是說,下面是(幾乎)等效的
int *i = &a;
int &j = a;
假設a是在前面幾行中定義的整數。參考文獻j出現後,與(* i)的出現完全等價。主要區別在於引用不會給你內存管理帶來的痛苦,而指針則會(你有責任處理新的和刪除的內容)。另外,一個指針不必指向某個東西,而一個引用不能指向任何東西。除此之外,你可以認爲他們的行爲是一樣的。
因此,抽象對象的引用是絕對合法的。你會經常在函數簽名中找到它,其中多態行爲可以通過引用或指針來實現。但是參考文獻得到更輕的語法,如下面的代碼段示出了
A a;
A* ptr = &a;
A& ref = a;
ref();
ptr->operator()();
(*ptr)();
假設類A重載operator()
。
- 1. 使用抽象類中抽象類的引用抽象類c
- 2. 引用抽象類中的inherting類
- 3. 引用抽象類類型的結構
- 4. 引用抽象類的子類
- 5. 傳遞對繼承自抽象基類的類的引用
- 6. JPA:堅持引用抽象類集合的對象
- 7. @JvmField對通用/抽象類
- 8. 如何在抽象java類中獲取對子類的引用
- 9. 對通用接口的抽象引用
- 10. 引用代替抽象類的指針
- 11. 對象是抽象類的超類嗎?
- 12. 抽象類如何具有引用而不是對象?
- 13. 如何從純抽象基類引用創建對象副本?
- 14. 如何在Qt信號中使用對抽象類的引用?
- 15. 抽象對象或創建類對象
- 16. 對抽象類的引用無法傳遞給線程函數?
- 17. 如何通過引用抽象類 - Java
- 18. 抽象類中的動態抽象類
- 19. 抽象基類的抽象子類
- 20. 抽象類實現Cloneable;抽象對象的clone()
- 21. 創建抽象類的對象 - 錯誤
- 22. 超類對子類對象的引用
- 23. 抽象與抽象類
- 24. 抽象類非抽象方法調用
- 25. 不能分配抽象類型的對象 - 但類不是抽象的! (C++)
- 26. 使用抽象類
- 27. 從非抽象類派生抽象類
- 28. 抽象基類有抽象嵌套類
- 29. 抽象類和非抽象超類
- 30. 如果無法創建抽象類的新對象,抽象類中的非抽象方法有什麼意義?
這個問題太含糊。發佈代碼示例並解釋它爲什麼會讓您感到困惑。 – aschepler 2011-02-16 16:28:19
這是否意味着在另一端可能有任何具體的子類? – Piskvor 2011-02-16 16:30:32