Я пытаюсь понять, почему приведение из базового класса к производному классу с использованием указателей прекрасно компилируется, но приведение с использованием объекта без указателя выдает ошибку C2440.
Ниже у меня есть базовый класс ThreadedMessage
который наследуется классом 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, но те, которые я прочитал, не кажутсяответить на мой вопрос.