我需要从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,请重新考虑您在做什么。 –