首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >派生类上的C++模板转换

派生类上的C++模板转换
EN

Stack Overflow用户
提问于 2010-11-04 20:32:27
回答 6查看 3.9K关注 0票数 4

我有3个类,它们是彼此派生的:

代码语言:javascript
复制
class Basic{
...
}

class Extended : public Basic{
...
}

class Full : public Extended{
...
}

我有一个模板类,其中包含这个类中的5-5个:

代码语言:javascript
复制
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吗?(我只想往上投)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-04 20:56:07

一种解决方案是创建一种可以包装组的视图类,并将单个对象公开为基类实例:

代码语言:javascript
复制
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;
};

你可以这样使用它:

代码语言:javascript
复制
group<Full> fullGroup;
group_view<Full, Extended> extendedGroupView(fullGroup);

如果您将group的公共接口提取到一个抽象基类中,您甚至可以多态地使用group_view

票数 3
EN

Stack Overflow用户

发布于 2010-11-04 20:40:05

不,这三种类型是不相关的,您不能在它们之间进行强制转换。

理解原因的一个很好的例子是:假设您有一个std::list<Dog>,其中Dog继承自Animal。您可能会认为,可以将std::list<Dog>转换为std::list<Animal>是很自然的;但这段代码会发生什么呢?

代码语言:javascript
复制
std::list<Dog> dogList;
// ... fill dogList as appropriate
std::list<Animal> animalList = dogList; // Should this be legal?
Animal aml = animalList.get(); // Fine; you get a Dog, which is an Animal
animalList.insert(Cat()); // Aww: you are trying to add a Cat to a Dog list!
票数 3
EN

Stack Overflow用户

发布于 2010-11-04 20:37:45

具有不同参数的类模板被C++类型系统视为完全不同的类型。因此,group<Basic>group<Extended>不是同一类型,您不能安全地在这两种类型之间进行转换。

只能在FullExtended的单个实例上向上强制转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4096655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档