我可以销毁基类并用此技巧在派生类中重新创建它吗?
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
}
}
类派生类和基类的所有声明都不能更改,结构参数也不能更改。
仅派生类的实现是允许更改的。
任何人都可以提出实现的想法吗?还有其他更温和的实现可以很好地满足这种情况(使用动态选择base-ctor初始化不可复制的基类)吗?
最佳答案
派生类构造函数取决于首先构造的有效基类对象。通过销毁基类,我几乎可以肯定,您正在调情未定义行为。例如,您可能会看到这体现在虚函数上。
正确的方法是让Derived类将参数作为初始化列表的一部分传递给Base类构造函数:
Derived(params p) : base(p) {};
关于c++ - 如何使用运行时选择base-ctor初始化不可复制的基类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11838608/