倾斜最佳实践(C ++)

时间:2017-02-04 14:06:59

标签: c++ polymorphism

静态代码分析工具往往会漫无目的地关注"将基类向下转换为派生类"我还找到了几个编码标准指南,提到不这样做,所以我想知道什么是最佳实践方式。

这是我的用例:

我有一个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]));
    }
}

重新解释一下,由于嵌入式平台的限制,我不能使用dynamic_cast(C ++ 11也是如此),但作为接口的Base类保证了对象是DerivedA或DerivedB。

我可以让DerivedA和DerivedB只实现纯虚拟调用,因此我不必担心向下转换任何内容,但DerivedA和DerivedB类非常专业,doMagic与实例完全不同。

所以我想知道你们如何处理这个问题 - 拥有一个非常不同的对象阵列,但是从一个基础继承,迭代它们并从外部做一些专门的东西。

2 个答案:

答案 0 :(得分:2)

您可能应该尝试使用访客模式。 这是一个简单的例子:

#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;
}

答案 1 :(得分:1)

如果您知道基类的指针指向派生类的对象,则可以使用static_cast。与reinterpret_cast或C-Cast不同,编译器将插入适当的代码来调整偏移量。