我们可以在任何需要基础 class 的地方使用派生 class 吗? (在模板的上下文中)

Can we use derived class in place for anywhere requiring the base class? (In the context of templates)

我是 C++ 的新手,但我似乎找不到这个问题的答案。

如果我有一个 class 模板 <Type>,其构造函数采用 ClassA<Type> 的对象类型,并且我有另一个 class 按以下方式派生: class ClassB : public ClassA<Animal>,我可以将 classB 类型的对象传递给第一个构造函数吗?

这完全取决于构造函数是否通过 reference/pointer 获取其参数。如果没有,对象将 sliced 变成 ClassA<Type>.

#include <memory>

template <typename Type>
class ClassA {};

class ClassB : public ClassA<Animal> {};

template <typename Type>
class ClassUser1 {
public:
    explicit ClassUser1(ClassA<Type>);
}

template <typename Type>
class ClassUser2 {
public:
    explicit ClassUser2(std::unique_ptr<ClassA<Type>>);
}

在此设置中,调用 ClassUser1<Animal>::ClassUser1{ClassB{}} 将构造一个临时 ClassB,它将用于移动构造一个 ClassA<Animal>(切片对象)。

调用 ClassUser2<Animal>::ClassUser2{std::make_unique<ClassB>()} 将如您所愿;指向的实例仍然是 ClassB.