我需要從A *到C *的隱式轉換; 我無法更改A的定義或實現。以隱式方式在不同類型之間進行類型轉換
class A
{
};
struct B: public A
{
};
struct C: public B
{
};
當我寫了以下內容:
A* p;
C* q = p;
我得到一個錯誤C2440;不能從A *轉換爲C *。 我能做些什麼給我不能改變的事實A.這兩個類都是原始數據的普通結構。
我需要從A *到C *的隱式轉換; 我無法更改A的定義或實現。以隱式方式在不同類型之間進行類型轉換
class A
{
};
struct B: public A
{
};
struct C: public B
{
};
當我寫了以下內容:
A* p;
C* q = p;
我得到一個錯誤C2440;不能從A *轉換爲C *。 我能做些什麼給我不能改變的事實A.這兩個類都是原始數據的普通結構。
你可以做到這一點的唯一方法是使用強制:
// a C++ style static_cast:
C* q = static_cast<C*>(p);
// or the less verbose C-style cast
C* q = (C*)p;
因爲C
是A
和衍生不是每個A
是一個C
,它不能被隱式鑄造(比如你可以隱含地將C*
投射到A*
,因爲每C
是A
(即,A
具有比C
「少或相等的特徵」,但不多於))。
我懷疑你真的必須有指針類型之間的隱式轉換。你認爲你做了什麼?
C是A的擴展結構,其中擴展部分僅由C內部使用。而賦值部分應該只分配C和A的匹配成員。 – sramij
@sramij這與需要隱式轉換有什麼關係?指針不會那樣工作;你不能「只分配A的匹配成員」。如果您想要投射_object_(不是指針),您可以定義一個轉換運算符。但你不能那樣做指針。 –
如果你可以改變C,你可以創建一個帶有A *的轉換構造函數。如果您完全肯定A實際上是C,那麼可以使用dynamic_cast或static_cast 如果A不是C,請重新考慮您在做什麼。 –