如何调用遍历类层次结构的成员函数
How to call member functions traversing up the class hierarchy
>假设类具有属性/特征,我需要将它们累积到派生类中,这在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 << " ";
}
相关文章:
- 如何重构类层次结构以避免菱形问题
- 具有结构成员char数组的sscanf
- 仅使用结构名称访问结构成员
- 使用 structType*& 赋给结构成员
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- C++ 中模板化类型的类层次结构
- 为什么结构化绑定不使用"auto&"返回对结构成员的引用,而是返回成员本身
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 是否可以将结构数组别名为结构成员数组?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 检查类是否在继承层次结构中显式定义了成员类型
- 如何调用遍历类层次结构的成员函数
- C 类在层次结构中没有数据成员
- 用静态const成员构建类层次结构
- 静态调度以使用聚合类型的层次结构更正成员方法
- 如何使继承层次结构中的成员函数始终返回相同的值
- c++:指针数据成员在类继承层次结构中的行为