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

Implicit cast of class derived from template base class

本文关键字:转换 基类 派生      更新时间:2023-10-16

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

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();
}

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

我本以为我可以将从Base<B>派生的Object隐式转换为Base<A>,就像BA派生一样。我做错了什么吗?或者我怎么能隐式地投射?这一点很重要,因为我需要接受Base方法中所有类型的派生类作为参数

提前谢谢。

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

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

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

显然,实现必须取决于Base的实际实现。请注意,此构造函数不能替代普通的复制构造函数。