我想定义一个可变参数模板类BaseA
,它具有可变函数execute(...)
。子类使用确定的参数扩展execute(...)
。
我尝试了一个演示代码,但是它具有类型转换错误,如何收集所有子类并使用execute
?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// template base class A
template <typename ... Types>
class BaseA{
virtual int execute(Types ...) = 0;
};
// subclass 1
class SubA1:public BaseA<int>{
int execute(int b) override {
//...
return 0;
}
};
// subclass 2
class SubA2:public BaseA<int, string>{
int execute(int b, string c) override {
//...
return 0;
}
};
int main() {
vector<BaseA<> *> as(2);
as[0] = (BaseA<int> *) new SubA1(); // type conversion error here
as[0]->execute(1);
return 0;
}
感谢任何想法。
创建向量时*> as(2);您期望向量可以接受任何类型。我认为这在C ++中是错误的。向量只能接受类型。
当您使用模板实例化基类类型时,编译器将为您生成以下类层次结构。
class BaseA_int {
public:
virtual int execute(int) = 0;
};
// subclass 1
class SubA1 :public BaseA_int {
public:
int execute(int b) override {
//...
return 0;
}
};
class BaseA_int_string
{
public:
virtual int execute(int, string) = 0;
};
// subclass 2
class SubA2 :public BaseA_int_string {
int execute(int b, string c) override {
//...
return 0;
}
};
并且在这里您可以看到派生类使用不同的基类。由于向量只能是Base <> *类型,但是您正在为其分配Base类型,因此编译器会出错。
因此,基和基完全是两个不同的基类。
以下内容将编译,没有任何问题,但是它不能接受Base
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// template base class A
template <typename ... Types>
class BaseA {
public:
virtual int execute(Types ...) = 0;
};
// subclass 1
class SubA1 :public BaseA<int> {
int execute(int b) override {
//...
return 0;
}
};
// subclass 2
class SubA2 :public BaseA<int, string> {
int execute(int b, string c) override {
//...
return 0;
}
};
int main() {
vector<BaseA<int> *> as(2);
as[0] = (BaseA<int> *) new SubA1(); // type conversion error here
as[0]->execute(1);
return 0;
}