【发布时间】:2013-04-25 04:42:46
【问题描述】:
struct Base {
Base (type1, type2, type3);
Base (); // <--- should be invoked only by `Derived_2`
virtual ~Base() = 0; // an abstract class
};
上面说Base,我们有多个派生类:Derived_1,Derived_2,...,Derived_N。
在构造对象时,所有派生类都必须调用 Base(type1, type2, type3) 构造函数,但 Derived_2 除外,它在构造对象时应使用 Base()(默认构造函数)。
有没有办法(C++11 可以)有这样的规则?换句话说,如果Derived_2 以外的任何人尝试使用默认的无参数构造函数,那么编译器应该会报错。
编辑:对于那些询问设计问题的人,我同意这一点。这是我的看法。
- 实际上,我根本不想要默认构造函数。全部
必须使用带参数的构造函数,它需要 runtime
type1, type2, type3形式的参数。 - 现在,我看到继承层次结构中的几个类
对象将在
main()获取之前被全局实例化 执行。当然,这些都是特殊情况,必须娱乐 他们通过引入一个默认构造函数 - 但是,这种治疗仅适用于 1 类或最多 2 类。休息一下 类必须保持调用带参数构造函数的规则。
我希望这能说明这个想法。
【问题讨论】:
-
你想解决什么问题?
-
需要了解其派生类型的基类并不是一个很好的设计。可能值得尝试重新设计它。
-
如果派生类不能使用其基类中的公共方法,则看起来您正在破坏“is-a”关系。参见 Meyer 的 Effective C++,第 32 条:“公共继承意味着 is-a。适用于基类的所有内容也必须适用于派生类”
-
@KyleStrand,Julien,Peter,查看更新。
-
不可能将gobal对象改为指针并在
main()内动态分配并避免使用默认构造函数?
标签: c++ inheritance c++11 constructor