如何在C ++中实现这个流畅的界面:
class Base {
public:
Base& add(int x) {
return *this;
}
}
class Derived : public Base {
public:
Derived& minus(int x) {
return *this;
}
}
Derived d;
d.add(1).minus(2).add(3).minus(4);
当前代码不起作用,因为Base类对Derived类等一无所知。我非常感谢提示/建议。
答案 0 :(得分:11)
使基类模板化。使用所需的返回类型Base模板类型,如下所示:
template <typename T>
class Base {
public:
T& add(int x) {
return *static_cast<T *>(this);
}
}
然后继承像Base这样的Derived:
class Derived : public Base<Derived>
或者(作为诺亚评论的答案),如果您不想更改Base,您可以使用执行转换的中间类,如下所示:
template <typename T>
class Intermediate : public Base {
public:
T& add(int x) {
Base::add(x);
return *static_cast<T *>(this);
}
}
让Derived继承自Intermediate:
class Derived : public Intermediate<Derived>
答案 1 :(得分:1)
在C ++中无法使用此接口。您必须在Base中创建minus()虚函数或使用执行某种形式的类型检测的非成员函数。
除非在Base方面有意义,否则不要拉负()。
答案 2 :(得分:1)
问题在于您的功能
Base& add(int x);
这类似于operator + =(),它也必须被覆盖才能无缝地工作。
您需要在派生类上重写此函数。
class Derived : public Base {
public:
Derived& minus(int x) {
return *this;
}
Derived & add(int x) {
return static_cast<Derived &>(this->Base::add(x));
}
}
这样d.add(1)将返回对d的引用。