我有 3 个相互派生的类:
class Basic{
...
}
class Extended : public Basic{
...
}
class Full : public Extended{
...
}
我有一个模板类,其中包含来自此类的 5-5 个:
template <class T>
class group{
public:
...
private:
T one, two, three, four, five;
};
group<Basic> basicGroup;
group<Extended> extendedGroup;
group<Full> fullGroup;
我可以轻松地将 fullGroup 转换为 basicGroup 或将 extendedGroup 转换为 basicGroup 吗? (我只想向上投)
最佳答案
一种解决方案是创建一种可以包装组的 View 类,并将单个对象公开为基类实例:
template <class T>
class group{
public:
const T & getOne() { return one; }
private:
T one, two, three, four, five;
};
template <class T, U>
class group_view {
public:
group_view(group<T> & inner) : innerGroup(inner) {}
const U & getOne() { return dynamic_cast< const U &>(one); }
private:
group<T> & innerGroup;
};
你可以这样使用它:
group<Full> fullGroup;
group_view<Full, Extended> extendedGroupView(fullGroup);
如果将group
的公共(public)接口(interface)提取到一个抽象基类中,您甚至可以多态地使用group_view
。
关于派生类上的 C++ 模板转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4096655/