2011-08-15 99 views
1

我需要從A *到C *的隱式轉換; 我無法更改A的定義或實現。以隱式方式在不同類型之間進行類型轉換

class A 
{ 
}; 

struct B: public A 
{ 
}; 

struct C: public B 
{ 

}; 

當我寫了以下內容:

A* p; 
C* q = p; 

我得到一個錯誤C2440;不能從A *轉換爲C *。 我能做些什麼給我不能改變的事實A.這兩個類都是原始數據的普通結構。

+0

如果你可以改變C,你可以創建一個帶有A *的轉換構造函數。如果您完全肯定A實際上是C,那麼可以使用dynamic_cast 或static_cast 如果A不是C,請重新考慮您在做什麼。 –

回答

5

你可以做到這一點的唯一方法是使用強制:

// a C++ style static_cast: 
C* q = static_cast<C*>(p); 

// or the less verbose C-style cast 
C* q = (C*)p; 

因爲CA衍生不是每個A是一個C,它不能被隱式鑄造(比如你可以隱含地將C*投射到A*,因爲CA(即,A具有比C「少或相等的特徵」,但不多於))。

我懷疑你真的必須有指針類型之間的隱式轉換。你認爲你做了什麼?

+0

C是A的擴展結構,其中擴展部分僅由C內部使用。而賦值部分應該只分配C和A的匹配成員。 – sramij

+1

@sramij這與需要隱式轉換有什麼關係?指針不會那樣工作;你不能「只分配A的匹配成員」。如果您想要投射_object_(不是指針),您可以定義一個轉換運算符。但你不能那樣做指針。 –