![](/img/trans.png)
[英]Pass a pointer or reference to derived class such that base class method is called
[英]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。 將DerivedClass
給BaseClass
時,將它傳遞給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.