Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL列表中的多个对象类型,C++;_C++_List_Object_Stl - Fatal编程技术网

C++ STL列表中的多个对象类型,C++;

C++ STL列表中的多个对象类型,C++;,c++,list,object,stl,C++,List,Object,Stl,所以我有这种类型的继承: 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 iterato

所以我有这种类型的继承:

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;
}
因此,基本上我为每个对象调用
fC
fB
,而不管其类型如何,基类的虚函数在调用的对象不正确时被调用

这不可能是对的,是吗?我还能怎么做到呢


顺便说一句,我应该为E、C和B类使用作文吗?

你是对的:不要那样做。如果要打印项目,请在
A
中调用函数
print
,并在两个子类中重写它。然后在迭代时对每个项调用
print
,每个子项都做了正确的事情。

如果intfB()和intfC()在技术上是相同的函数,但对B和C有不同的实现,那么您应该在A中声明一个虚拟函数(可能称为intf),并在B和C中为其提供必要的实现

抽象类的思想是定义该类的更详细实现将共享的基本功能。因此,使用上述方案,列表元素指向的每个对象都将保证有一个intf()实现


我不确定您的示例是否会编译(尽管我没有测试过),因为如果您想在
B
上调用一个函数,在
C
上调用另一个函数,那么B和C都不会为A中声明的虚拟函数提供实现,您在设计阶段做了一些错误的事情。您似乎理解虚拟函数的概念,所以我不会建议使用
virtual int f()
,这对于B和C来说是不同的,但您可能正在寻找
((B*)(*I))->fB()
,不是吗?我有点不明白您想要做什么。假设我是std::list::iterator类型,那么您应该能够对列表中的每个对象调用i->fB()和i->fC(),并获得正确的实现(如果它是B对象,则获得B::fB和a::fC,如果它是C对象,则获得a::fB和C::fC)。如果这不是你想要的,那么你不应该把它们都放在同一个列表中,可能它们不应该都来自同一个基础。是的,如果它是B对象,我想避免调用A::fC,因为它不需要,但如果我必须将对象放在同一个std:list中,我找不到任何方法。fB和fC实际上有不同的实现,它们分别对于B类和C类是唯一的,我只需要在类A中将它们都声明为虚拟的,这样我就可以使用迭代器从列表中调用它们。我想这正是我想要的,但不知怎么的,我没能想到这一点。谢谢你帮我解开裤子^^
cout << (*i) -> fB();
cout << (*i) -> fC();