我们可以在任何需要基类的地方使用派生类来代替吗?(在模板的情况下)

问题描述 投票:0回答:1

我对C++很陌生,但我似乎找不到这个问题的答案。

如果我有一个类模板 <Type> 的构造函数,其对象类型为 ClassA<Type>我有另一个类以如下方式派生。class ClassB : public ClassA<Animal>,我是否可以传入一个类型为: classB 到第一个构造函数中?

c++ templates derived-class
1个回答
0
投票

这完全取决于构造函数是否通过referencepointer接受参数。 如果不是,那么对象将是 切片 变成 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.

© www.soinside.com 2019 - 2024. All rights reserved.