我可以通过这个技巧销毁基类并重新创建吗?
class base: noncopyable
{
base(); //ctor with none param
base(int x); //ctor with one param
base(int x, int y); //ctor with two param
virtual ~base();
}
struct params
{
int x;
int y;
enum
{
typeNoneParam, //neither x nor y is defined
typeOneParam, //only x is defined
typeTwoParam //x and y both are defined
}typeParam;
}
class Derived
{
Derived(params p); //construct base class conditionally by p.typeParam
}
Derived::Derived(params p)
:base() //default typeNoneParam
{
//typeNoneParam need not do special process
if (p.typeParam == params::typeOneParam)
{
base::~base(); //delete the default-typeNoneParam creation by base-dtor
base(p.x); //recreate the new base with one-param base-ctor
}
if (p.typeParam == params::typeOneParam)
{
base::~base(); //delete the default-typeNoneParam creation by base-dtor
base(p.x, p.y); //recreate the new base with two-param base-ctor
}
}
类派生和基础的所有声明都不会改变,struct params也不能。
仅允许更改派生类的实现。
任何人都可以提出有关实施权的想法吗?任何其他更温和的实现都能满足这种情况(init不可复制的基类,动态选择base-ctor)吗?
答案 0 :(得分:1)
在这种情况下,我会向派生类添加一个静态工厂函数(可选择使您的构造函数受到保护)。您可以将开关置于typeParam
并使用正确的构造函数创建对象。您需要在派生类中有三个构造函数,每个构造函数对应一个枚举项。
这样可以在没有黑客的情况下提供正确的行为。
答案 1 :(得分:0)
Derived类构造函数依赖于首先构造的有效Base类对象。通过摧毁Base类,我几乎是肯定的,你正在调用Undefined Behavior。例如,您可能会看到这表现为虚函数。
正确的方法是让Derived类将参数作为初始化列表的一部分传递给Base类构造函数:
Derived(params p) : base(p) {};