所以我有这种类型的继承:
Class A { virtual intfB(){} ; virtual intfC(){}; };
Class B : public A { int fB(){}; };
Class C : public A { int fC(){}; };
然后我有一个E类,它使用一个列表来存储B和C对象。
Class E
{
public:
insert(A* obj){ l.push_front(obj);}
print(){ /* uses iterator i to cout the fB() and fC() of the objects in l */ };
private:
list <A*> l;
}
我在B
中将C
和virtual
对象的不同函数设置为A
,然后使用迭代器i从{{1}中访问l个对象功能。我的问题是我无法找到一种正确的方法来调用print()
和B::fB()
,因为迭代器可以指向C::fC()
或C
对象,所以我必须做类似的事情对于每个我认为不实用的对象:
B
因此,无论类型如何,我都会为每个对象调用cout << (*i) -> fB();
cout << (*i) -> fC();
和fC
,并且当它不是被调用的正确对象时,将调用基类的虚函数。
这不可能是对的,不是吗?我怎么能实现这一目标?
另一方面,我应该使用E,C和B类的作文吗?
答案 0 :(得分:0)
你是对的:不要这样做。如果要打印项目,请调用print
中的函数A
,并在两个子类中重写它。然后在迭代时对每个项目调用print
,每个孩子做正确的事。
答案 1 :(得分:0)
如果intfB()和intfC()在技术上是相同的函数但具有不同的B和C实现,那么你应该在A中声明一个虚函数(也许称为intf),并在两者中提供必要的实现B和C.
抽象类的想法是定义该类的更详细实现将共享的基本功能。因此,使用上述方案,列表元素指向的每个对象都将保证具有intf()实现。
我不确定你的例子是否会编译(我没有测试过),因为B和C都没有为A中声明的虚函数提供实现。