Gui*_*gis 8 c++ inheritance templates abstract-class
我有一个有限数量的类与几乎相同的实现,唯一不同的是他们操作的基础数据类型:
class IntContainer
{
public:
void setData(int data);
int getData();
int _data;
};
class BoolContainer
{
public:
void setData(bool data);
bool getData();
bool _data;
};
class StringContainer
{
public:
void setData(std::string data);
std::string getData();
std::string _data;
};
// Etc. You get the idea.
Run Code Online (Sandbox Code Playgroud)
我想通过使用如下模板来减少这些类的代码重复:
template<typename T>
class GenericContainer
{
public:
void setData(T data);
T getData();
T _data;
};
Run Code Online (Sandbox Code Playgroud)
专业化:
typedef GenericContainer<int> IntContainer;
typedef GenericContainer<bool> BoolContainer;
typedef GenericContainer<std::string> StringContainer;
Run Code Online (Sandbox Code Playgroud)
这很好用.但我还想为这些专用类添加一个抽象基类,以便能够以通用方式操作它们(例如,在集合中).问题是这个基类应该有getData
和setData
方法能够调用它们,即使不知道被操纵的对象的动态类型.
我会用这样的东西实现它:
class Base
{
public:
virtual void setData(??? data) = 0;
virtual ??? getData() = 0;
};
// Modify GenericContainer's definition like so
template<typename T>
class GenericContainer : Base { ... }
Run Code Online (Sandbox Code Playgroud)
并以某种方式使用它:
int main(int argc, char const *argv[])
{
IntContainer intc = IntContainer();
intc.setData(42);
std::cout << intc.getData() << std::endl;
BoolContainer boolc = BoolContainer();
boolc.setData(false);
std::cout << boolc.getData() << std::endl;
std::vector<Base> v;
v.push_back(intf);
v.push_back(boolf);
for (std::vector<Base>::iterator it = v.begin() ; it != v.end(); ++it)
std::cout << it->getData() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何编写Base
方法原型,因为类型是未知的(并且无关紧要,应该在运行时根据对象的动态类型调用派生类实现).
TL; DR:如何在几个完全专用的模板类上实现抽象基类?