避免向下倾斜

时间:2018-05-22 03:08:27

标签: c++ c++11 c++14

如何在使用界面时防止向下转换?我已经在stackoverflow上读了一些答案,如果你不得不贬低那么你很可能有一个弱的界面。那你们怎么样呢,以及正确的方法是什么?我有一个具体的例子,我想知道如何正确避免向下转发。在我的示例中,我有一个用于传递数据的接口,但具体实现可能包含唯一属性。在A类和B类中,我需要向下转换为DataType1或DataType2,因为它们可以返回不同的属性类型。

struct IData
{
    virtual ~IData();
};

struct IAction
{
    virtual ~IAction();
    virtual void setup(IData& data) = 0;
};

class DataType1 : public IData
{
    int data1;
public:
    DataType1();
    int getData1();
};

class DataType2 : public IData
{
    std::string data2;
public:
    DataType2();
    std::string getData2();
};

class A : public IAction
{
public:
    A();
    void setup(IData& data) override;
}

class B : public IAction
{
public:
    B();
    void setup(IData& data) override;
}

2 个答案:

答案 0 :(得分:0)

我认为,在代码中包含向下转换指令不是什么大问题。据我所知,这是有效的,这就是C ++具有dynamic_cast <>操作的原因。

答案 1 :(得分:0)

您的界面应将需要在子类上调用的所有方法定义为虚拟方法(最好是纯虚拟方法)。

在这种情况下,您的界面可以具有2个虚拟方法 getData ;或者,如果使用c ++ 17或更高版本进行编译,则可以尝试使用 std :: any < / em>