【发布时间】:2012-12-20 12:04:35
【问题描述】:
当你有一个类型取决于某些约束的成员时,你如何设计多态性。
说我有这个:
template<typename T>
class Base
{
public:
Base() = default;
virtual ~Base() = default;
T member;
};
class DerivedA : public Base<int>
{
public:
DerivedA() {member = 5;}
};
class DerivedB : public Base<float>
{
public:
DerivedB() = default;
};
我希望能够根据不同的参数创建一个新的派生对象,即:
Base *b;
if (something)
b = new DerivedA();
else
b = new DerivedB();
显然我不能这样做,因为我需要为b的声明提供模板参数。
这是糟糕的设计吗?你如何处理这个?
我可以写一个小包装器:
class Wrapper() {};
template<typename T>
class Base : public Wrapper
{
// ...
};
Wrapper a, b;
a = new DerivedA;
b = new DerivedB;
但是我将无法直接访问member 或Base 或Derived 中声明的其他方法。我需要转换:reinterpret_cast<DerivedA*>(a)->member,使多态性无用。
谢谢
【问题讨论】:
-
您的设计存在问题... Wrapper 界面应该没问题,但您必须扭转问题才能使其工作。
-
假设
Base *b;以某种方式工作(奇迹,通过破解编译器,无论如何)。对于b,你会做什么?你能提供一个使用例子吗?
标签: c++ templates polymorphism factory