据我所知,您不能在 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/