从Baseclass获取其他功能

Get additional function from baseclass

本文关键字:功能 其他 获取 Baseclass      更新时间:2023-10-16

我对C 相对较新。我们有一个抽象基类和2个派生类。

class PositionBase  (abstract)
class PositionLenght: PositionBase
class PositionAngle:  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++中处理此问题的首选方法是什么?

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

在C 中,您可以将指针存储为将类派生到基础(摘要(类的一系列指针中。从那里,当您从数组中获取指针以基础的指针时,如果您需要来自派生类的特定功能,比你需要使用Dynamic_cast铸造从基础派生并检查结果,以查看铸造是否成功,以及是否可以调用您需要的功能。

完全相同(与c#中的相同(。您在基类中定义虚拟功能,并在派生类中使用所需功能覆盖它:

class PositionBase {
public:
    virtual void do_something() = 0;
};
class PositionLenght: public PositionBase {
    void do_something() override {
        std::cout << "doing something for lengthn";
    }
};
class PositionAngle: public PositionBase {
    void do_something() override {
        std::cout << "doing something for anglen";
    }
};
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