我们可以在任何需要基础 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
.
我是 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
.