下播最佳实践(C++)
Downcasting best-practice (C++)
静态代码分析工具往往会漫无边际地谈论"将基类下转换为派生类",我还发现了一些编码标准指南,其中提到了不要这样做,所以我想知道什么是最佳实践方式。
这是我的用例:
我有一个Base(接口)、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,但基类作为接口保证了对象是DerivedA或DerivedB。
我可以让DerivedA和DerivedB只实现纯虚拟调用,因此我不必担心下转换任何东西,但DerivedA和DerivedB类非常专业,doMagic对实例做完全不同的事情。。。
所以我想知道你们是如何做到这一点的——拥有一个由非常不同的对象组成的数组,但从一个基继承,在它们之间迭代,并从外部做一些专门的事情。
您可能应该尝试使用访问者模式。这里有一个简单的例子:
#include <cstdio>
class A;
class B;
class Visitor {
public:
void visit(A &a) {
printf("Visited An");
}
void visit(B &) {
printf("Visited Bn");
}
};
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;
}
如果知道基类的指针指向派生类的对象,则可以使用static_cast。编译器将插入适当的代码来调整偏移量,这与reinterpret_cast或C-cast不同。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在AVX通道中混洗的最佳方式
- 程序顶部的声明与定义(最佳实践)
- 别名模板的专业化 C++11 中没有开销的最佳替代方案