我有一个基类:
class Base{
public:
int id;
virtual void method();
bool identify(int _id);
...
}
和一些派生类:
class d1:public Base{
public:
int id;
void method();
bool identify(int _id);
...
}
class d2:public Base{
public:
int id;
void method();
bool identify(int _id);
...
}
每个子类在它的方法中彼此做不同的工作,根据它的id,方法identify()将检查这个子类是否必须处理数据。
现在,我有一个存储所有子类实例的数组,例如: Base * instances [];
当数据出现时,我做了:
for(i=0;i<instances.length;i++){
Base *temp=instances[i];
if(temp->identify(id))
temp->method(data);
}
然而,我完成了工作。但是对这种方法感到不舒服。
所以,我的问题是:最佳做法是什么?
ps:我知道多态的概念,但只是不知道如何使用它。我是c ++的新手,任何帮助都将受到赞赏。
答案 0 :(得分:1)
如果你必须在调用代码中决定是否根据它的虚拟类型调用类的方法,那么你就不会以一种好的方式使用多态。多态性是关于使实现类的行为彼此不同,即使它们像它们的基类的实例一样使用。所以,你的代码应该是这样的:
class Base {
public:
virtual void method(int id, /*args*/) { }
};
class Derived1 : public Base {
public:
virtual void method(int id, /*args*/) override {
if(id == something) {
//Do stuff
}
}
};
class Derived2 : public Base {
public:
virtual void method(int id, /*args*/) override {
if(id == somethingElse) {
//Do other stuff
}
}
};
和
for(i=0;i<instances.length;i++) {
instances[i]->method(data);
}
这个使用代码完全不知道它调用method()
的对象类型,它应该知道的是它在method()
的某些实现上调用Base
。< / p>