gpt4 book ai didi

c++ - 如何通过多态基类接口(interface)使用模板化子类

转载 作者:行者123 更新时间:2023-11-30 01:45:25 24 4
gpt4 key购买 nike

我有基本的父类和模板化的子类。我想使用集合中的 Childs 通过父级的多态接口(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 所提到的,存在两个缺陷:

  1. 对象切片。蹩脚的错误。 std::vector 使用原始对象
  2. 多态性仅适用于指针或引用

启用动态调度代码应该是这样的:

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com