从模板基类派生的类的隐式转换

时间:2011-06-04 18:16:08

标签: c++ templates inheritance casting implicit

我遇到了隐式转换,模板和模板类继承的问题。以下是我从项目中提取的内容,我遗漏了一些类甚至是抽象的,但它与案例没有关系。

class A {};
class B : public A {};

template <typename T> class Base {};
class Derived : public Base<B> {};

int main() {
    Derived d;
    Base<A>* base = new Derived();
}

基本上,我有一个模板基类Base,我从中派生Derived : public Base<B>。然后我必须将其转换为最常见的Base形式,即Base<A>

我原以为我可以隐式地从Base<B>Base<A>投射一个对象,因为B来自A。我做错了什么,或者我怎么能隐含地 ?这很重要,因为我需要在Base方法中接受所有类型的派生类作为参数

提前致谢。

2 个答案:

答案 0 :(得分:6)

这是不可能的。无论A和B之间的关系如何,Base<A>Base<B>关系。

答案 1 :(得分:2)

Base<B>不一定需要与Base<A>有关系。这与Derived没有任何关系。如果你想强制这样的关系,你将需要一个模板化的构造函数。

template <typename T>
class Base
{
    template <typename TOther>
    Base(const TOther& that)
    {
        // ...
    }
    // ...
};

显然,实施必须依赖于Base的实际实施。请注意,此构造函数不替代正常的复制构造函数。