根据输入参数值调用不同的基类构造函数

时间:2015-04-29 07:54:52

标签: c++ constructor derived-class

我有以下情况:

根据Derived类构造函数的输入值,我需要调用另一个Base类构造函数。

如:

struct Base
{
    Base() : v(0) {}
    Base(int _v) : v(_v) {}

    int v;
};

struct Derived
{
    Derived(int v) /* if v == 42 call Base() else call Base(int) */ {}
};

int main()
{
    Derived f2(42);
    Derived f1(1);
}

根据我目前对C ++的了解,我认为这是不可能的,所以我问社区他们是否知道任何黑客或脏代码会使这个可行。请不要让简单int误导您,现实生活场景要复杂得多。随意混合使用C ++ 11 magic。

编辑:另外,我不想使用“init”函数,它根据参数的值初始化不同的东西。

1 个答案:

答案 0 :(得分:7)

这确实是一个非常奇怪的请求,也许你应该重新考虑一般方法。这个特定42值的含义是什么? 问题的答案是什么?答案是什么?对于Derived案例或{{1},您可能应该有两个兄弟Derived或子类x==42可能x!=42来自不同类型的对象,您可以为该类型使用单独的构造函数吗?

但是如果你确实想要完成你所要求的,那么一种可能的方法是在42中有两个不同的构造函数和一个“命名构造函数”(静态函数)来在它们之间进行路由。类似的东西(没有检查可编辑性,但想法应该清楚):

Derived

为此,您还需要复制构造函数,但您也可以返回指针等。

另一种方法,如果在编译时固定42的值,则使用模板并将构造函数甚至类专门化为特定值42。

我认为应该使用的另一种方法,要求基类可以复制或移动构造:

struct Derived {
private:
    Derived(int x): Base(x) {} 
    Derived(): Base() {}
public:
    static Derived ConstructDerived(int x) {
        if (x==42) return Derived();
        else return Derived(x);
    }
};

// usage
Derived a = Derived::ConstructDerived(42);
Derived b = Derived::ConstructDerived(43);