У меня есть базовый класс родителя и шаблонные классы Child. Я хотел бы использовать Childs в коллекции, чтобы перечислить их полиморфным интерфейсом для родителя. Я ожидаю, что виртуальная (полиморфный) вызывает там - но у меня есть только статический набранное вызов Parent :: печать()Как использовать шаблонные дочерние классы по полиморфному базовому классу классов
#include <iostream>
#include <vector>
using namespace std;
class Parent {
public:
Parent() { cout << " parent ctor "; }
virtual void print() { cout << " Parent::print "; }
};
template <typename T>
class Child : public Parent {
public:
Child(T value) : var(value) { cout << " child ctor "; }
virtual void print() { cout << " Child::print " << var; }
protected:
T var;
};
int main() {
Child<int> myChild(1);
Child<double> myDoubleChild(2.);
vector<Parent> v = {myChild, myDoubleChild};
for (auto i : v) {
i.print();
}
return 0;
}
Фактический выход:
parent ctor child ctor parent ctor child ctor Parent::print Parent::print
Ожидаемый результат должен содержать " Child :: print "вызовы виртуальных функций
Возможно, вы захотите использовать интеллектуальные указатели вместо необработанных указателей. – ysdx
@ysdx То правда, этот код работает отлично: 'вектор> v = {make_shared > (1), make_shared > (1)};' –
barney
2. вызывается 1. так что то же самое вопрос – StenSoft