【发布时间】:2012-12-11 13:30:49
【问题描述】:
我有这样的事情:
class A {
void add (A* a) {
//add a to a vector<A*>
}
virtual void draw() = 0;
}
class B : public A {
void tick() {}
void draw() {}
}
class C : public A {
void draw() {}
}
现在我想做的是有一个这样的循环:
for(int i=0; i<vector.size(); i++) {
vector[i]->tick();
}
问题是不是这个向量中的所有元素都有tick()方法,但我仍然希望它们在同一个向量中,因为我还希望能够循环遍历向量并调用draw() on所有元素。有没有办法解决这个问题?我正在考虑使用另一个向量,但我不想这样做。
【问题讨论】:
-
尝试将
dynamic_cast转换为实现tick方法的类型?或者,在基类中有一个虚拟实现,对于没有实现该方法的类型没有任何作用...... -
不,不要做这两件事。如果您有一个对象向量,其中只有一些对象实现了您要调用的函数,那么它们应该位于多个集合中。创建有意义的接口,并且仅在有意义时从它们派生。
-
这是非常奇怪的声明
vector[i]-->tick(); -
为什么不给
A一个virtualtick什么都不做的方法。您可以在B中覆盖它。 (另外,不要创建普通指针的vector。要么使用智能指针的vector,要么使用ptr_vector,这取决于你在复制向量时想要发生的事情。) -
是的,我实际上想过让其中一个子类根本不派生自超类,这似乎更有意义。
标签: c++ oop inheritance vector subclass