2013-04-08 54 views
1

我對基於派生類的關係有這種疑問。基於派生類的關係

我知道當我們從基類派生一個類時,派生類將擁有關於基類的所有信息。但基類不知道派生類的任何內容。

那麼,爲什麼這是可以接受的?

Base *b=new Derived(); 

,而不是

Derived *d=new Base();. 

,基本上我需要了解的第一條語句的需要?我的意思是,將派生類對象分配給基類指針有什麼用處?

注意:這不是一項任務。即時通訊在學習編程的早期階段。所以基本上需要了解點點滴滴。如果這是非常基本的並且已經提出問題,請忽略。

+2

關鍵字:多態性。 – chris 2013-04-08 12:52:00

+5

,因爲'派生'是'基',但不是相反。 – 2013-04-08 12:53:09

+0

@chris&Oli Charlesworth:我站好了。評論刪除不要混淆人。 – lapk 2013-04-08 13:10:55

回答

2

你已經回答了你自己的問題,但我認爲是混淆你的指針

Derived *d=new Base(); 

派生類將有所有關於基類的信息。但是 基類不會知道派生類的任何內容。

是的,所以你期待,因爲這是宣佈爲派生Derived *d它應該知道關於基地的一切。但重要的是實際創造的東西。在這種情況下,您創建了基地new Base();並且Derived可能已添加更多Base,所以我們不能使用基地派生。

然而,在這種情況下

Base *b=new Derived(); 

createes一個新的衍生。但是我們只關心它從Base繼承的東西。哪一個是好的。

,因爲派生知道什麼是基礎

2

繼承定義了「是-a」關係。如果Derived具有Base作爲基類,則Derived是-a Base

換句話說:每Derived對象可以被視爲一個Base,這使得該有效:

Base* b = new Derived(); 

b取消引用允許訪問BaseDerived實例。

這不能反過來,因爲Base不是Derived。以下是無效的:

Derived* d = new Base(); // NOT VALID 
2

Derived類對象被創建時,首先調用Base類構造函數。類對象Derived包含Base類對象。這允許它調用它的Base函數。而Base類對象不包含Derived類對象

enter image description here

Base *b=new Derived(); 

在這裏你可以使用同一個函數來處理所有的派生類對象的情況下非常有用。

考慮,

父類:動物 派生類:狗,貓等

現在,你有一個函數

void doSomethingtoTheAnimal(//take Animal here);

如果不允許指定基地類對象轉換爲父引用變量。您將不得不爲DogCat等創建單獨的功能。

void doSomethingtoTheAnimal(Cat *b) or void doSomethingtoTheAnimal(Dog *b) 

然而,多態,你可以使用void doSomethingtoTheAnimal(Base *b);然後,你可以做

Base *b1 = new Dog()Base *b2 = new Cat();

,並使用相同的功能doSomethingtoTheAnimal(b1)doSomethingtoTheAnimal(b2)

此外,指着當基類指針到派生類對象只能調用父類中的函數或在子類中重寫。它不知道子類中專門定義的函數