我刚开始学习C++,正在尝试使用模板来构建特定类型类的层次结构,以实现多态。我知道在Java中使用泛型可以很容易地做到这一点。我相信这个问题已经被问过了,但我不知道用什么术语在C++中搜索我想要的。
我想使用一个基类,该基类由下面定义的非常具体的Derived_1
和Derived_2
类的对象组合而成,每个类都扩展自名为Base
的类。然而,我得到了一个编译器错误,说我需要声明类型?我该使用什么语法来指示这个在实现中使用的z
向量,可以由任何扩展自Base
的类的任意组合组成?
以下是我目前的代码,我认为在声明基类和扩展该基类的类方面大部分是正确的:
base_types.h
template <typename T>
class Base {
public:
Base<T>(size_t a, T b) :
m_a(a),
m_b(b) {
}
T getB() const;
size_t m_a;
T m_b;
};
// specific kind of Base that uses bool
class Derived_1 : public Base<bool> {
Derived_1(uint32_t a); // second parameter is unused, is assumed to be "true"
bool getB();
};
// specific kind of Base that uses size_t
class Derived_2 : public Base<size_t> {
Derived_2(uint32_t a, size_t b);
size_t getB();
};
base_types.cpp
Derived_1::Derived_1(uint32_t a) : Base(a, true) { } // second parameter is unused, is assumed to be "true"
bool Derived_1::getB() { return m_b; }
Derived_2::Derived_2(uint32_t a, size_t b) : Base(a, b) { }
bool Derived_2::getB() { return m_b; }
impl_types.h
#include "base_types.h"
#include <vector>
class Foo {
public:
Foo(
size_t y,
const std::vector<Base>& z); // Error: Use of class template 'Base' requires template arguments
};
impl_types.cpp
class Foo {
public:
Foo(
size_t y,
const std::vector<Base>& z) : // Error: Use of class template 'Base' requires template arguments
m_y{y},
m_z{z};
};
// Base.java
class Base<T> {
int m_a;
T m_b;
Base(int a, T b) {
m_a = a;
m_b = b;
}
T getB() {
return m_b;
}
}
// Derived_1.java
class Derived_1 extends Base<Boolean> {
Derived_1(int a, Boolean a) {
super(a, b);
}
Boolean getB() {
return m_b;
}
}
// Derived_2.java
class Derived_2 extends Base<String> {
Derived_2(int a, String b) {
super(a, b);
}
String getB() {
return m_b;
}
}
// Main.java
public class Main {
public static void main(String[] args) {
List<Base> baseList = new ArrayList<>();
baseList.add(new Derived_1(1, true));
baseList.add(new Derived_2(2, "foo"));
for(Base o : baseList) {
System.out.println(o.getB());
}
}
}
new ArrayList<>()
的等效物,除非您实现一些类似于Java泛型的类型擦除。 - 463035818_is_not_a_numberstd::vector<T>
中,T
必须是一种类型,但是Base
只是一个模板。 - 463035818_is_not_a_numbernew ArrayList<>();
使用了泛型,而模板不是泛型。如果你想要一个可以容纳不同类的实例,这些类都继承自一个共同的基类的数组,那么有一个解决方案,但它不需要你编写一个模板。 - 463035818_is_not_a_number