是否可以从循环中调用纯虚函数?
一些伪代码解释我试图实现的目标
(尝试了以下示例的一个版本,但得到了错误:抽象类类型的对象" Base"不允许)
class Base{
public:
virtual void printMe() =0;
};
class derivedOne{
public:
void printMe(){std::cout << "one "<<endl;
};
class derivedTwo{
public:
void printMe(){std::cout << "two"<<endl;
};
class holder{
private:
vector<derivedOne> one;
vector<derivedTwo> two;
void printDerive(vector<Base> bases){
for (Base base: bases)
{
base.printMe();
}
};
};
所有派生类都实现了printMe函数(因为它是一个基本的纯虚函数)。 我试图避免为每个从基础实现printMe的类编写一个打印循环,因为这些函数都会做同样的事情(循环向量中的项并调用printMe)。
答案 0 :(得分:3)
在基于范围的for循环中,您不能拥有vector<Base>
或Base base
,因为Base
是抽象的,并且这两者都需要构建Base
。
一种解决方案是为std::vector<std::unique_ptr<Base>>
和one
存储two
,以便您可以获得动态调度:
class holder{
private:
std::vector<std::unique_ptr<Base>> one;
std::vector<std::unique_ptr<Base>> two;
public:
void printDerive(const std::vector<std::unique_ptr<Base>>& bases){
for (auto&& base: bases)
{
base->printMe();
}
};
};
另一个选择是保持您的存储空间不变并具有模板功能来打印它们:
class holder{
private:
std::vector<derivedOne> one;
std::vector<derivedTwo> two;
public:
template <class T>
void printDerive(const std::vector<T>& ts){
for (auto&& t: ts)
{
t.printMe();
}
};
};
这些解决方案会对您分配元素和使用向量产生影响,因此请根据您的其他要求进行选择。
答案 1 :(得分:0)
您的问题将是创建vector<Base>
:这是不允许的,因为它需要实例化抽象类Base
。
你可以有vector
个指针作为基础,因为只有指针(和引用)可以表现多态(注意:你的函数应该采用vector
通过const
引用而不是值:
void printDerive(const vector<std::unique_ptr<Base>>& bases){
for (auto& base: bases)
{
base->printMe();
}
};