我想弄清楚如何改变矢量的类型。类foo表示许多算法使用的数据结构。但是,新要求是将最后的处理算法的结果存储为浮点数据。下面的代码显示了问题的最低版本
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class foo{
protected:
vector<int> a;
public:
virtual void print(){
cout<<"foo type of " <<sizeof(a[0])<<endl;
};
};
class bar: public foo
{
vector<double> a;
};
int main()
{
foo f;
f.print();
bar b;
b.print();
return 0;
}
&#34;程序的输出&#34;是:
foo type of 4
foo type of 4
我的期望是:
foo type of 4
foo type of 8
那么如何在没有大量代码重复的情况下获得这样的结果呢? 我期待着您的回音。
答案 0 :(得分:2)
你可以尝试使用这样的模板:
#include <iostream>
#include <vector>
template <typename Type>
class foo{
protected:
std::vector<Type> a;
public:
void print(){
std::cout << "Foo type of " << sizeof(a[0]) << std::endl;
}
};
int main()
{
foo<int> f;
f.print();
foo<double> b;
b.print();
return 0;
}
示例输出:
Foo type of 4
Foo type of 8
答案 1 :(得分:2)
当涉及编译时已知的类型时,静态多态(使用模板)通常比运行时多态(使用虚函数)更强大。
您的期望是基于错误的假设,即在派生类中隐式重新定义虚函数。由于您没有覆盖虚拟功能,因此您不会从虚拟功能中获益,您也可以省略virtual
关键字。因为它是在基类中定义的,所以它总是引用基类中的a
成员。
MPI_回答显示了使用模板的可能方法。 编辑:对于基于运行时多态性的解决方案,您可以将静态与动态多态相结合,从而实现一种称为类型擦除的技术:
struct Base
{
virtual void print() const = 0;
}
template <typename T>
struct Derived : Base
{
virtual void print() const
{
...
}
std::vector<T> a;
};