Производный класс возвращает выделенный экземпляр базового класса - PullRequest
1 голос
/ 10 апреля 2020

Является ли следующий файл git в C ++? Производный класс выделяет базовый класс и приводит его к производному. Очевидно, что если производная (C) имеет членов, любой, кто обращается к членам через возвращенный указатель, потерпит неудачу. Но даже без членов в производной - это le git? UB?

struct B { int a; };
struct C : B { 
   static C* get() {
       return static_cast<C*>(new B);
   }
   enum { X, Y,};
};
int main(){
   C* c = C::get();
   return c->X;
}

1 Ответ

4 голосов
/ 10 апреля 2020

Это UB. Выдержка из стандарта (выделено мое):

8.2.9 Stati c cast - пуля 11

Значение типа «указатель на cv1 B» где B является типом класса, может быть преобразовано в значение типа «указатель на cv2 D», где D - это класс, производный от B, если cv2 - это та же квалификация cv, что и cv1 или более высокая квалификация, чем cv1 , Если B является виртуальным базовым классом D или базовым классом виртуального базового класса D, или если не существует действительного стандартного преобразования из «указателя на D» в «указатель на B» ([conv.ptr]), программа плохо сформирован. Значение нулевого указателя преобразуется в значение нулевого указателя типа назначения. Если значение типа «указатель на cv1 B» указывает на B, который на самом деле является подобъектом объекта типа D, результирующий указатель указывает на включающий объект типа D. В противном случае поведение не определено.

...