首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向下预测最佳实践(C++)

向下预测最佳实践(C++)
EN

Stack Overflow用户
提问于 2017-02-04 22:06:59
回答 2查看 384关注 0票数 2

静态代码分析工具倾向于漫无边际地谈论“将基类向下转换为派生类”,我还找到了几个编码标准指南,其中提到不要这样做,所以我想知道什么是最佳实践方法。

下面是我的用例:

我有一个基础(接口),DerivedA,DerivedB类,然后是一个包含基础指针的数组。

然后我迭代数组,并基于一个标志,我确定对象是DerivedA还是DerivedB,向下强制转换,并从外部对对象进行一些随机填充。

基本上是这样的:

代码语言:javascript
复制
// 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使用实例做了完全不同的事情……

所以我想知道你们是如何处理这件事的--有一个由非常不同的对象组成的单一数组,但是继承自一个单一的基础,迭代它们并从外部做一些特殊的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-04 22:25:37

您可能应该尝试使用访问者模式。下面是一个简单的例子:

代码语言:javascript
复制
#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;
}
票数 2
EN

Stack Overflow用户

发布于 2017-02-04 22:24:49

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42041294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档