我有基本的父类和模板化的子类。 我想使用集合中的子级通过父级的多态接口(interface)来枚举它们。 我期望那里有虚拟(多态)函数调用 - 但我只有对 Parent::print() 的静态类型调用
#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”虚拟函数调用
最佳答案
正如 @tchelidze 和 @StenSoft 提到的,有两个缺陷:
- 对象切片。蹩脚的错误。 std::vector 使用原始对象
- 多态性仅适用于指针或引用
启用动态调度代码应该是这样的:
#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};
vector<Parent*> v = {&myChild, &myDoubleChild};
for (auto i : v) {
// i.print();
i->print();
}
return 0;
}
这给出了所需的输出:
parent ctor child ctor parent ctor child ctor Child::print 1 Child::print 2
关于c++ - 如何通过多态基类接口(interface)使用模板化子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34692068/