我试图理解为什么使用指针从基类强制转换为派生类的编译效果很好,但是使用非指针对象进行强制转换会产生错误C2440。
下面我有一个ThreadedMessage
由class继承的基类GPSMessage
。
struct ThreadedMessage
{
ThreadedMessage()
: m_Type(0), m_ID(0)
{ }
ThreadedMessage(uint Type, uint ID = 0) :
m_Type(Type), m_ID(ID)
{ }
uint m_Type;
uint m_ID;
};
struct GPSMessage : public ThreadedMessage
{
GPSMessage()
: ThreadedMessage()
{ }
GPSMessage(double lat, double lon)
: ThreadedMessage(1), m_lat(lat), m_lon(lon)
{ }
double m_lat;
double m_lon;
};
在myFunction
我尝试将基类转换为派生类。
void myFunction(const ThreadedMessage& msg)
{
const GPSMessage* message = static_cast<const GPSMessage*>(&msg); // Compiles fine
const GPSMessage message1 = static_cast<const GPSMessage>(msg); // Error C2440
}
的调用myFunction()
如下所示:
GPSMessage msg(21.123, 12.321);
myFunction(msg);
编译时,指针的转换可以正常编译,但非指针的转换失败,并出现以下错误:
错误C2440:“ static_cast”:无法从“ const ThreadedMessage”转换为“ const GPSMessage”没有构造函数可以采用源类型,或者构造函数重载解析度不明确
为什么我不能使用非指针变量将基类转换为派生类?
编译器为MS VS 2008 C ++。
是的,我看过其他类似的SO问题,但我阅读的问题似乎无法回答我的问题。
这两个角色具有不同的含义。
第一个演员:
const GPSMessage* message = static_cast<const GPSMessage*>(&msg); // Compiles fine
这意味着它msg
实际上是一个GPSMessage
(或派生的)对象。您要求编译器将其msg
作为威胁GPSMessage
。不会创建新对象,message
将指向msg
。如果msg
不是实际GPSMessage
(或派生),则此演员表具有未定义的行为。
顺便说一句,以下强制转换具有相同的含义(广播至参考文献):
const GPSMessage& message = static_cast<const GPSMessage&>(msg); // same meaning, which results in a reference instead of a pointer
关于第二个演员:
const GPSMessage message1 = static_cast<const GPSMessage>(msg); // Error C2440
这意味着您要从创建一个新对象。您应该提供一种使这种转换成为可能的方法。例如,您应该创建一个具有参数的构造函数:message1
msg
GPSMessage
ThreadedMessage
struct GPSMessage {
GPSMessage(const ThreadedMessage &); // needed constructor
};
或创建一个转换操作符ThreadedMessage
来GPSMessage
:
struct ThreadedMessage {
operator GPSMessage(); // conversion operator
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句