簡體   English   中英

子班的類型

[英]Types of child classes

我有一個問題,哪種類型適用於所有具有靜態類型和某種OOP的語言。

如果我有一個類A,一個是A的子代的類B,一個是B的子代和類型A的變量的類C,是否也可以在其中存儲B和C的實例?

在Delphi中,答案是肯定的。

例如,我創建了一個語法高亮的文本編輯器組件。 該組件具有屬性FormattingProcessor ,其類型為TFormattingProcessor 現在,我創建了幾個格式化處理器,例如TXMLFormattingProcessorTPascalFormattingProcessorTINIFormattingProcessor ,每個類都是TFormattingProcessor的子TFormattingProcessor 這些中的任何一個都可以分配給文本編輯器組件的FormattingProcessor屬性。

也就是說, TFormattingProcessor可以將聲明為TFormattingProcessor的變量賦值為TXMLFormattingProcessorTPascalFormattingProcessorTINIFormattingProcessor類型的值。

如果您在VCL中四處查看,您會發現這種分配實際上非常普遍。 例如, TLabel組件具有FocusControl屬性,該屬性的類型為TWinControl (如果我沒FocusControl話)。 您可以將TWinControl任何后代分配給該屬性,例如TEdit (FocusControl是在與Alt鍵一起鍵入標簽的加速鍵時將獲得鍵盤焦點的控件。)

在C ++中,答案是否定的。 如果類型是A*A& ,答案將是,但是對於A則不是。

在Java,C#和其他語言中,變量默認情況下是對對象的引用,答案是肯定的。

當您說類“ B”是“ A”的子代以及在何處進行訪問時,如果不知道是什么類型的繼承,就無法可靠地回答此問題。 換句話說,在不知道基地是否可訪問和明確的情況下,不可能正確回答這個問題。

$ 11.2 / 4-“如果可以訪問基類的發明的公共成員,則可以訪問基類。”

假設“ A”是“ B”的明確且可訪問的基數,並且“ B”是“ C”的明確且可訪問的基數,並且“ A”,“ B”和“ C”是具體的類(沒有純虛功能)

B b;
C c;

A &rb = b;       // OK
A &rc = c;       // OK 

A *pb = &b;      // OK
A *pc = &c;      // OK

A a1 = b;        // sliced, only 'A' subobject of 'B' is copied onto 'a1', may be a logical error
A a2 = c;        // sliced, only 'A' subobject of 'C' is copied onto 'a2', may be a logical error

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM