2011-08-15 60 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_(不是指针),您可以定义一个转换运算符。但你不能那样做指针。 –