静态代码分析工具通常会在“将基类转换为派生类”方面走很多路,而且我还找到了一些编码标准指南,但它们并未提及这样做,因此我想知道最佳实践方法是什么。
这是我的用例:
我有一个Base(接口(interface)),DerivedA,DerivedB类,然后是一个包含Base指针的数组。
然后,我遍历数组并基于一个标志,确定对象是DerivedA还是DerivedB,将其强制转换并从外部对对象进行一些随机处理。
基本上是这样的:
// arr is of type Base**
for (int i = 0; i < size; ++i)
{
// doMagic has an overload for both types
if (arr[i]->isDerivedA())
{
doMagic(reinterpret_cast<DerivedA*>(arr[i]));
}
else if (arr[i]->isDerivedB())
{
doMagic(reinterpret_cast<DerivedB*>(arr[i]));
}
}
关于重新解释,由于嵌入式平台的限制(与C++ 11相同),我无法使用dynamic_cast,但作为接口(interface)的基类保证对象是DerivedA或DerivedB。
我可以使DerivedA和DerivedB仅实现纯虚拟调用,因此我不必担心向下转换任何内容,但是DerivedA和DerivedB类非常专业,而doMagic会对实例执行完全不同的操作...
所以我想知道你们是如何实现的-拥有一个非常不同的对象的单个数组,但是从一个基础继承而来,遍历它们并从外部进行一些专门的工作。
最佳答案
您可能应该尝试使用访客模式。
这是一个简单的示例:
#include <cstdio>
class A;
class B;
class Visitor {
public:
void visit(A &a) {
printf("Visited A\n");
}
void visit(B &) {
printf("Visited B\n");
}
};
class A {
public:
virtual ~A() { }
virtual void applyVisitor(Visitor &v) {
v.visit(*this);
}
};
class B : public A {
public:
~B() override { }
void applyVisitor(Visitor &v) override {
v.visit(*this);
}
};
int main() {
A a;
B b;
Visitor v;
a.applyVisitor(v);
b.applyVisitor(v);
return 0;
}