我有两个类,如下所示:
class Plot
{
protected:
virtual void plot() = 0;
}
class DynamicPlot : public Plot
{
public:
virtual void update_real_time();
virtual void plot();
}
class StaticPlot : public Plot
{
public:
virtual void plot();
}
像这样的容器:
std::vector<Plot*> plot_vector;
plot_vector.append(new DynamicPlot());
plot_vector.append(new DynamicPlot());
plot_vector.append(new StaticPlot());
plot_vector.append(new StaticPlot());
如果实例的类型是DynamicPlot,我想调用update_real_time()。
foreach(Plot *plot, plot_vector)
{
if(/* plot type == DynamicPlot */)
{
plot->update_real_time();
}
plot->plot();
}
我应该在这里使用哪种模式?将一个空的update_real_time()方法添加到StaticPlot类中似乎不是一个好的解决方案。
编辑:上面的代码不是真的。我只是写它是为了告诉我的问题,认为这是一个伪代码。我没有费心去编写访问限定符。在我的真实代码中,我没有私有继承或切片问题。我在向量中保留实例的指针。抱歉,误解了。无论如何我正在修理它。
答案 0 :(得分:1)
您需要使用dynamic_cast
:
foreach(Plot *plot, plot_vector)
{
DynamicPlot* p = dynamic_cast<DynamicPlot*>(plot);
if(p)
{
p->update_real_time();
}
plot->plot();
}
除了foreach
不是C ++之外,所以你也必须使用实际代码。