将基类构造函数复制到子类?

时间:2009-09-30 22:54:31

标签: c++ inheritance constructor

我有一个很大的集合类,我需要在一个非常薄的子类中“包装”。基类的功能不会改变,它们的界面保持不变。

问题是,为了使用基类的构造函数(并且大多数都有多个),我需要在每个子类中对相同的构造函数进行十进制,并简单地将参数传递给构造函数基类(99%的时间我在施工时没有别的办法)。这是一项毫无意义的工作。

最简单的方法是什么?

编辑即使该语言本身不支持,也许有一些工具可以自动生成该代码?

4 个答案:

答案 0 :(得分:2)

您可以为包装类添加所有可能参数的模板化构造函数:

template<class Base>
class wrapper : public Base {
public:
  wrapper() : Base() {}

  template<typename T1>
  wrapper(T1 a1) : Base(a1) {}

  template<typename T1, typename T2>
  wrapper(T1 a1, T2 a2) : Base(a1, a2) {}

  // ...
};

由于模板不会被实例化为未被调用的构造函数,因此这些其他构造函数是否无效并不重要。只有实际使用的构造函数需要存在于基类中:

class A {
public:
  A(int a) {};
};

int main() {
   wrapper<A> aw(1);
   return 0;
}

可能存在一些极端情况,这种方法会导致问题,但对于简单的情况,它会起作用。

答案 1 :(得分:1)

除非你能使用C ++ 0x,否则我认为你运气不好。阅读这篇文章:

Automatic creation of constructor, based on parent class' constructor (C++)

答案 2 :(得分:0)

一般的想法让我建议

class BaseClass {
public:
    BaseClass(foo, bar, baz);
};

template <class T>
class BaseInheritor : public BaseClass {
public:
    T(foor, bar, baz);
};

class Child : public BaseInheritor<Child> {
    // Other stuff
};

我不认为C ++模板可以完全按照我刚刚编写的内容进行操作。宏有一个非常简单的答案,但我觉得很脏:

#define CHILD_CLASS_DEFAULT(name) \
class name : public BaseClass { \
    public: name(foo, bar, baz) : BaseClass(foo, bar, baz) { } \
    private:


#define CHILD_CLASS_OVERRIDE(name) \
class name : public BaseClass { \

答案 3 :(得分:0)

我会选择基于脚本的解决方案,可能基于gccxml或类似的东西 有了它,您可以编写一个简单的脚本(即generate-derivate <input-file> <base-name> <derivative-name> <output-file>)来生成包装器。如果要添加/更改功能,则只需手动进行更改。

编辑:模糊的大纲:

write derivative-name + " : public " + base-name + " {\npublic:\n"
foreach <Constructor> where attribute name == base-name
    write "\tderivate-name("
    foreach <Argument>
       resolve by attribute type (query FundamentalType, ReferenceType, ...)
       write argument type etc.
    write ");\n"
write "\n};\n"

这完全取决于您使用的脚本语言和xml工具。奇趣科技在their example中有XQuerys。