我想在c ++中像jquery-way一样进行链式调用。样本:
$('#obj').getParent().remove();
所以,据我所知,该类的每个方法都应该返回指向他自己的指针(这个)。
在我调用基础派生方法之前,一切都还可以。代码:
class Base
{
Base *base1() { return this; }
Base *base2() { return this; }
};
class Derived : Base
{
Derived *derived1() { return this; }
Derived *derived2() { return this; }
};
Derived *obj = new Derived();
obj->derived1()->derived2(); // Everything is okay
obj->derived1()->base1()->derived2(); // Fail at second step
当然, base1 会返回Base的指针。有没有办法自动铸造?
UPD:也许这可能与宏有关?像
#define CORRECT_RETURN (this)
和
Base::base1() {
return CORRECT_RETURN;
}
这样的东西。或者编译器不会看这样的构造?
答案 0 :(得分:2)
是。覆盖base1
中的base2
和Derived
方法,将其返回值从Base*
更改为Derived*
,例如
class Derived : Base
{
Derived *base1() { return this; }
Derived *base2() { return this; }
Derived *derived1() { return this; }
Derived *derived2() { return this; }
};
这称为返回类型的协方差,在C ++中是合法的。
假设您想要实际使用基类方法中实现的某些功能而不重复它,您可以这样做:
class Derived : Base
{
Derived *base1() { Base::base1(); return this; }
Derived *base2() { Base::base2(); return this; }
Derived *derived1() { return this; }
Derived *derived2() { return this; }
};
在你提出之前,不,你不能创建一种情况,其中基类的每个派生类使用具有适当协方差的返回类型自动覆盖base1
和base2
方法。你必须每次都手动完成,或者编写很多脚手架代码,使它看起来像是正在发生的事情,这通常比它的价值更麻烦。