假设我有两个抽象类,A1
和A2
。 A1
有一个叫做foo()
的函数,A2
有一个叫做bar()
的函数。我创建了许多不同的这些基类的子类,比如C1,C2,C3
,...,可能会也可能不会继承A1
和/或A2.
我现在想要遍历所有类型的A1
和所有类型的A2
并调用foo()
resp bar()
。我的问题是实现这一目标的最佳方法是什么?我的方法是使用智能指针或包含C1,C2,...
实例的向量,即:
std::vector<C1> c1s;
std::vector<C2> c2s;
std::unique_ptr<C3> c3;
...
然后我声明了两个整数,n_A1
和n_A2
,它们指定每个抽象类A1
和A2
有多少个实例。然后我定义了两个指针数组:
A1 **a1s = new A1*[n_A1];
A2 **a2s = new A2*[n_A2];
然后手动将实例的所有地址添加到这些阵列。例如,如果c1s
的长度为2,c2s
的长度为3,如果C1
继承A1
,C2
继承A2
,C3
继承A1
和A2
,我会做:
a1s[0]=&c1s[0];
a1s[1]=&c1s[1];
a2s[0]=&c2s[0];
a2s[1]=&c2s[1];
a2s[2]=&c2s[2];
a1s[2]=c3.get();
a2s[3]=c3.get();
所以n_A1=3
和n_A2=4
和我现在可以遍历地址数组a1s和a2s并调用函数foo()
或bar()
。当删除包含所有这些对象的实例时,我只需要释放数组a1s
和a2s
。
不断建议不要在C ++中使用原始指针,我想知道这是否是解决这个问题的好方法?这种方法有风险吗?有没有更好的方法呢?
class IA
{
virtual ~IA();
}
class A1 :public IA
{
virtual ~A1();
virtual void foo();
}
class A2 :public IA
{
virtual ~A2();
virtual void bar();
}
class C1 :public A1
{
virtual ~C1();
virtual void foo();
}
class C2 :public A2
{
virtual ~C2();
virtual void bar();
}
class C3 :public A1,public A2
{
virtual ~C3();
virtual void foo();
virtual void bar();
}
int main()
{
std::vector<IA*> AllAsObjects;
AllAsObjects.push_back(new C1());
AllAsObjects.push_back(new C2());
AllAsObjects.push_back(new C3());
for (IA* Obj :AllAsObjects)
{
if(dynamic_cast<A1*>(Obj))
dynamic_cast<A1*>(Obj)->foo();
if(dynamic_cast<A2*>(Obj))
dynamic_cast<A2*>(Obj)->bar();
}
}
我想这就是你需要的
*请注意这是自编译的