我有一些课程有一些named constructors。当我继承它们时,我应该如何继承构造函数?问题是它们返回基类的对象而不是子类的对象。
附带问题:我可以使用C ++ 0x“使用”来减少样板代码的数量吗?
答案 0 :(得分:3)
struct Foo {
template<typename T> static T one () { return T(1); }
};
struct A { int x; A(int i) : x(i) {}};
struct B : A { B(int i) : A(i) {}};
允许您执行
之类的操作A a = Foo::one<A> ();
B b = Foo::one<B> ();
答案 1 :(得分:1)
您既不继承“经典”构造函数,也不继承“命名”构造函数。您应该为每个派生类创建特定的构造函数。
这是一个例子,命名构造函数如何与继承一起使用:
class SpiralPoint: public Point{
private: SpiralPoint(float t, float r)
:Point(Point::polar(r*t, t)) { };
};
答案 2 :(得分:1)
命名ctor是一个成语,它们 不是真正的构造函数 。严格来说,命名的ctors依赖于static
函数。继承需要virtual
个函数。现在,非成员不能是虚拟的,因此排除了static virtual
函数的想法。
附带问题:我可以使用C ++ 0x“使用”来减少样板代码的数量吗?
using
声明要求编译器继承基类ctors的 all-or-none 。所以,是的,他们可以简化你的代码。但是,您的所有编译器都支持C ++ 0x吗?
答案 3 :(得分:0)
我发现(几乎)完美的解决方案!
template <class T>
class Color {
public:
static T Red () { return T (0); }
static T Green () { return T (1); }
static T Blue () { return T (2); }
protected:
explicit Color (int raw) : raw (raw) {
}
private:
int raw;
};
class MoreColor : public Color <MoreColor> {
public:
static MoreColor Octarina() { return MoreColor(8); }
private:
friend class Color <MoreColor>;
explicit MoreColor (int raw) : Color <MoreColor> (raw) {}
};
void Test() {
MoreColor o = MoreColor::Octarina();
MoreColor r = MoreColor::Red();
}
它编译:D