【问题标题】:Get additional function from baseclass从基类获取附加功能
【发布时间】:2019-07-05 14:19:32
【问题描述】:

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

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++ 中处理这个问题的首选方法是什么?

【问题讨论】:

  • 在 C++ 中,可以将纯抽象类视为“接口”。
  • 另外请不要描述你的代码,尝试创建一个minimal reproducible example来显示它。
  • 这种基于类类型的条件逻辑是代码异味。处理这个问题的传统 OOP 方法是将逻辑移到派生类中,通过基接口调用它,然后让多态处理选择调用哪个版本的函数。
  • 如果您需要知道一个类是给定类型的,那么不要将它存储为另一种类型。如果您有一个PositionLenght 数组和另一个PositionAngle 数组,问题就会自行解决。

标签: c++ class inheritance


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    完全相同(与 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
    

    【讨论】:

    • Radoslaw,我明白你的意思,但就我而言,PositionAngle 有一个方法 GetAngle(),而 PositionLength 有一个方法 GetLength()。这些方法未在基​​类中定义
    • 您要求“首选”方式。 :) 如果您可以修改基类,则将抽象方法添加到基类并在派生类中覆盖它,在各自的类中调用GetAngleGetLength。如果你不能,那么你将不得不使用dynamic_cast 来处理多态性。
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 2015-12-31
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多