簡體   English   中英

如何將派生類的指針傳遞給引用基類的指針?

[英]How to pass pointer of derived class to reference to pointer of base class?

這是示例代碼。

class BaseClass {
};

class DerivedClass : public BaseClass {
};

int Foo(BaseClass*& ptr) {
}

DerivedClass* ptr_to_derived;

//following will not work
Foo(ptr_to_derived);

我無法編譯上面的代碼,錯誤消息是“ can't convert DerivedClass* to BaseClass*& ”。 那么如何將ptr_to_derived傳遞給Foo?

錯誤消息非常清楚:

錯誤:從' BaseClass* '類型的右值開始無效初始化' BaseClass*& '類型的非const引用

因為Foo通過非const引用獲取指針,所以不能將它傳遞給rvalue。 DerivedClassBaseClass時,將它傳遞給Foo會發生隱式轉換, DerivedClass獲得錯誤所抱怨的rvalue。

您可以從派生的指針創建一個基指針並傳遞:

DerivedClass* ptr_to_derived;
BaseClass* ptr_derived_base = ptr_to_derived;

Foo(ptr_derived_base);

你不能這樣做。

您可以做的是轉換為指向基礎的指針,將轉換后的指針存儲在某處(例如變量),並通過左值引用傳遞它。 引用不能引用派生指針。 像這樣:

BaseClass* ptr_to_base = ptr_to_derived;
Foo(ptr_to_base);

但是,最好按值傳遞指針以避免這種麻煩。 或者優選地甚至在足夠的情況下傳遞參考而不是指向基座的指針。 像這樣:

int Foo(BaseClass& ref)

有了這個你可以打電話:

DerivedClass1 d1;
DerivedClass2 d2;
Foo(d1);
Foo(d2);

// or with pointers
DerivedClass1* d1_ptr = &d1;
DerivedClass2* d2_ptr = &d2;
Foo(*d1_ptr);
Foo(*d2_ptr);

問題是Foo可能會修改傳遞的指針到基礎。 例如:

class OtherDerivedClass : public BaseClass {
};

OtherDerivedClass* ptr_to_other_derived = ...;

void Foo(BaseClass*& ptr)
{
    ptr = ptr_to_other_derived;
}

如果你可以用ptr_to_derived來調用這個Foo ,你認為會發生什么? ptr_to_derived現在應該指向DerivedClass而不指向OtherDerivedClass對象嗎? 這在每個級別上都是錯誤的。

解決方案1:不允許Foo修改指針。 要么通過價值:

void Foo(BaseClass* ptr)

或者通過const-ref:

void Foo(const BaseClass*& ptr)

解決方案2:創建Foo可以修改的指向基類的變量。

BaseClass* ptr_to_base = ptr_to_derived;
foo(ptr_to_base);

這當然會使ptr_to_derived修改。 C ++不允許你傳遞一個臨時表達式(這是從DerivedClass*BaseClass*的轉換會返回的),因為Foo說它會修改那個指針並且只會丟棄更改的臨時表達式。 那通常是個錯誤。 您當然可以決定不關心Foo可能會對ptr_to_base所做的更改。

出於正當理由這是非法的,請看下面的代碼:

class BaseClass {};

class DerivedClass :public BaseClass {};
class DerivedClass2 :public BaseClass {};

DerivedClass2 derived2;

void Foo(BaseClass*& ptr) {
    ptr = &derived2; // Legal.
}

DerivedClass* ptr_to_derived = nullptr;

那么如果合法, Foo(ptr_to_derived)會使ptr_to_derived到不相關的DerivedClass2 ,這是錯誤的。

暫無
暫無

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

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