В следующем коде я возвращаю производный класс CDerived
по значению из функции, возвращающей его базовый класс CBase
.
Например, CDerived
содержит поле _number
, и я понимаю, что оно отсекается во время преобразования в тип возвращаемого значения по значению, CBase
.
Однако меня смущает то, что виртуальная функция Print
каким-то образом трансмутируется в свою версию базового класса. В этом случае v-table не просто был разрезан, а был изменен.
В моем фактическом коде _number
не существует, как и других данных. Я хотел бы иметь возможность возвращать производный класс только для его v-таблицы, которая объявлена базой.
Из этого вопроса я вижу, что могу обойти эту конкретную проблему, вернув указатель на функцию (или я полагаю, что создаст свою собственную v-таблицу), но почему именно v-таблица изменяется в первую очередь, и есть ли способ обойти это изменение? .
#include <iostream>
class CBase
{
public:
virtual void Print() { std::cout << "CBase" << std::endl; }
};
class CDerived : public CBase
{
int _number;
public:
explicit CDerived(int n) : _number(n) { }
virtual void Print() override { std::cout << "CDerived" << std::endl; }
};
CBase GetBase()
{
return CDerived(42);
}
int main()
{
CBase base = GetBase();
base.Print(); // Outputs CBase
return 0;
}
_number
в данном случае), которых не существует. - person user202729   schedule 06.08.2020CDerived
, вы возвращаетеCBase
, преобразованный из чего-то. - person StoryTeller - Unslander Monica   schedule 06.08.2020