Ваша проблема с
MainClass(const A &myA) : myPolymorphicClass(std::make_shared<A>(myA)) {}
Здесь вы используете std::make_shared<A>(myA)
, что означает, что независимо от того, на что ссылается myA
, вы только создадите часть A
в указателе. Это означает, что вы всегда будете вызывать A
версию функции, потому что все, что у вас есть, это A
. Вам нужен шаблон типа
template <typename T>
MainClass(const T &myA) : myPolymorphicClass(std::make_shared<T>(myA)) {}
И теперь вы создадите указатель на производный класс, который будет храниться в myPolymorphicClass
. Если вы хотите даже добавить SFINAE в шаблон, чтобы ограничить T
производным от A
, например
template <typename T, std::enable_if_t<std::is_base_of_v<A,T>, bool> = true>
MainClass(const T &myA) : myPolymorphicClass(std::make_shared<T>(myA)) {}
Все это работает в этом живом примере