如何调用遍历类层次结构的成员函数

时间:2019-03-25 12:57:48

标签: c++

假设类具有属性/特征,而我需要在派生类中进行累加,那么在C ++中如何工作?

struct Base
{
    virtual Array names() { return { "A", "B" }; }
};

struct Derived : Base
{
   Array names() override { return { "C", "D", "E" }; }
};

struct FurtherDerived : Derived
{
   Array names() override { return { "F", "G" }; }
};

现在,如果我想在Base中实现一个递归函数allNames()来派生所有串联的名称,那将如何工作?例如

FurtherDerived fd;
fd.allNames() ==> {"A", "B", "C", "D", "E", "F", "G"}

Derived d;
d.allNames() ==> {"A", "B", "C", "D", "E"}

Base b;
b.allNames() ==> {"A", "B"}

我无法解决这个问题。

2 个答案:

答案 0 :(得分:4)

在添加自己的方法之前,应先调用每个基类方法:

struct Base
{
    virtual Array names() { return { "A", "B" }; }
};

struct Derived : Base
{
   Array names() override { return Base::names() + { "C", "D", "E" }; }
};

struct FurtherDerived : Derived
{
   Array names() override { return Derived::names() + { "F", "G" }; }
};

这当然假定您的Array类型支持与operator+合并。

答案 1 :(得分:0)

  

现在,如果我想在Base中实现一个递归函数allNames()来派生所有串联的名称,那将如何工作?

您将无法在C ++中执行此操作。 (尚未)没有反射,因此如果您不自行指定层次结构,您将无法知道层次结构。但是,您可以做的是自己在allNames函数中指定它,并利用可以从派生类调用基类函数的事实。这样做会给你类似的东西:

using Array = std::vector<std::string>;

Array operator +(Array lhs, Array const& rhs)
{
    lhs.insert(lhs.end(), rhs.begin(), rhs.end());
    return lhs;
}

struct Base
{
    virtual Array names() { return { "A", "B" }; }
    Array allNames() { return names(); }
};

struct Derived : Base
{
   Array names() override { return { "C", "D", "E" }; }
   Array allNames() { return Base::names() + names(); }
};

struct FurtherDerived : Derived
{
   Array names() override { return { "F", "G" }; }
   Array allNames() { return Base::names() + Derived::names() + names(); }
};

int main()
{
    FurtherDerived f;
    auto ret = f.allNames();
    for (auto const& e : ret)
        std::cout << e << " ";
}