0
是否有任何區別:將對象投射到基類或派生類?
cBase* object = new cDerived();
和
cDerived* object = new cDerived();
如果是這樣,在這種情況下,我選擇了另一種?
是否有任何區別:將對象投射到基類或派生類?
cBase* object = new cDerived();
和
cDerived* object = new cDerived();
如果是這樣,在這種情況下,我選擇了另一種?
區別在於他們聲明object
具有不同的類型,這可能會產生很多後果。例如:
cDerived
宣佈任何新成員(超出了它cBase
繼承),那麼只有cDerived* object
版本使那些可用的(除非你明確地垂頭喪氣回到cDerived*
)。cBase
聲明cDerived
覆蓋的任何非虛擬成員函數,那麼調用哪個函數取決於您用來調用它的指針的類型。cDerived*
,那麼您無法將其傳遞給cBase*
(除非您明確地將其轉回cDerived*
)。object
的靜態類型在您的兩個示例中有所不同。讓我們舉個例子:
struct A {};
struct B : A
{
void method() {}
};
int main() {
A* a = new B;
B* b = new B;
a->method(); // compile error, A has no member named method.
b->method(); // fine. b's static type is B*, and B has a member named method
}
這不要緊,a
實際指向一個B
對象;其靜態類型是A*
和A
沒有名爲method
的成員。
'cBase * object;'和'cDerived * object;'有什麼區別? – immibis
這就是我想找到的。 – drum