从基类获取附加功能

时间:2019-07-05 14:19:32

标签: c++ class inheritance

我对C ++比较陌生。我们有一个抽象基类和2个派生类。

class PositionBase  (abstract)
class PositionLenght: PositionBase
class PositionAngle:  PositionBase

PositionBase包含获取名称之类的功能。 派生类具有诸如GetLenght()GetAngle();

之类的方法

(旧)应用程序包含一个包含派生类的数组。

假设我从array[1]获取对象,并且根据其类型,我想运行GetLength() or GetAngle()。然后,我需要知道从数组中获得的对象类型。

当我使用时:

 if(PositionBase->IsKindOf(RUNTIME_CLASS(PositionLenght))))
        {do something}   

它不起作用。有效的是

if(typeid(*PositionBase) == typeid(PositionLenght)))
    {do something}

我也可以只“ dynamic_cast”对象,如果它不返回NULL,那就很好。

C#中我将使用接口,在C++中处理此问题的首选方法是什么?

2 个答案:

答案 0 :(得分:0)

如果我很好理解,您需要的是:

在C ++中,您可以将派生类的指针存储到基类(抽象)的指针数组中。 从那里, 当您从数组中获取指向基数的指针时, 如果您需要派生类中的特定功能, 比你需要的 使用dynamic_cast强制转换为base的派生对象,并检查结果以查看强制转换是否成功以及是否可以调用所需的函数。

答案 1 :(得分:0)

完全相同(与C#中相同)。您可以在基类中定义虚函数,并在派生类中用所需的功能覆盖它:

class PositionBase {
public:
    virtual void do_something() = 0;
};
class PositionLenght: public PositionBase {
    void do_something() override {
        std::cout << "doing something for length\n";
    }
};
class PositionAngle: public PositionBase {
    void do_something() override {
        std::cout << "doing something for angle\n";
    }
};
int main() {
    PositionBase *arr[] = {
        new PositionLenght(),
        new PositionAngle(),
    };
    for(auto i = 0; i < 2; ++i) arr[i]->do_something();
}

将打印:

doing something for length
doing something for angle