假设类具有属性/特征,而我需要在派生类中进行累加,那么在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"}
我无法解决这个问题。
答案 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 << " ";
}