类型转换(来自派生类)

时间:2010-08-31 18:58:48

标签: c++ class casting types

我想在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;
}

这样的东西。或者编译器不会看这样的构造?

1 个答案:

答案 0 :(得分:2)

是。覆盖base1中的base2Derived方法,将其返回值从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; }
};

在你提出之前,不,你不能创建一种情况,其中基类的每个派生类使用具有适当协方差的返回类型自动覆盖base1base2方法。你必须每次都手动完成,或者编写很多脚手架代码,使它看起来像是正在发生的事情,这通常比它的价值更麻烦。