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

How to call member functions traversing up the class hierarchy

本文关键字:层次结构 成员 函数 遍历 何调用 调用      更新时间:2023-10-16

>假设类具有属性/特征,我需要将它们累积到派生类中,这在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"}

我一辈子都想不通这一点。

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

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+合并。

现在,如果我想在 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 << " ";
}