【发布时间】:2011-10-29 10:06:05
【问题描述】:
据我所知,您不能在 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 解决方案。
【问题讨论】:
-
如果可以,用c++11,直接解决你的问题。
-
我不明白你发现你的第一个选项有什么问题......这是在构造过程中初始化基础对象的标准方法。如果您稍后需要完成更多初始化,您可以在派生调用 C'tor 主体中相应地更新字段。
-
选项2根本不编译,怎么可能是选项?
-
@UncleBens:如果你没有
const或&成员,我会工作。
标签: c++ constructor code-reuse c++03