c++ - 我如何在 C++03 中伪造构造函数继承?

标签 c++ constructor code-reuse c++03

据我所知,您不能在 C++ 中继承构造函数。但是在某些情况下,可能需要看起来您可以像实例化它们的基类一样实例化继承类:

struct Base {
  int i;
  int const j;
  Base(int i, int j) : i(i), j(j) {}
};

// option 1)
struct Derived1 : Base {
  Derived1(int i, int j) : Base(i,j) {}
};
Base* baseFactory() {
  return new Derived1(42,47);
}

// option 2)
struct Derived2 : Base {
};
Base* baseFactory() {
  Base* b = new Derived2();
  b->i = 42;
  b->j = 47; // broken!
  // alternative could be to implement Base::operator=
  return b;
}

请注意,如果不是针对派生类的基类,则可以默认构造派生类。

选项 1 是通常所做的,我认为,但您正在键入代码而没有表达任何新内容。选项 2 破坏了 const 的正确性(并阻止您使用引用作为成员),因为一切都必须是可分配的。

有解决这个问题的好方法吗?

编辑:C++11 很棒,但不幸的是我需要一个 C++03 解决方案。

最佳答案

选项 1 是 C++03 中的惯用方式,它确实需要更多的输入,但语言就是这样。选项 2 甚至不等同,您将无法初始化 Derived2,因为 Base 没有默认构造函数,并且 的定义隐式声明 Derived2 的默认构造函数需要它。

但除了语言的技术难度之外,您正在用构造换取两阶段构造,这绝不是一个好主意,同时还迫使您使用Derived2 到动态分配的对象。

关于c++ - 我如何在 C++03 中伪造构造函数继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938204/

相关文章:

php - 组合递归迭代器结果 : children with parents

c++ - 构造函数参数无法识别

Swift:创建一个将类类型作为参数的工厂函数,并输出该类的构造函数

ios - 使用 Storyboard重用自定义 UIVIewController 中的 child

c++ - 如何在 Maya API 中从 MObject 获取 Node 类实例

c++ - 使用显式构造函数

android - 如何重用android alertdialog

c++ - OOP C++ - 错误,因为 A.h 包含 B.h,B.h 又包含 A.h

c++ - 如何更改 MFC 中的 VIEW 大小以适合输入图像?

c++ - 使用 Sun Studio 12 移植到 Solaris SPARC