类型转换(来自派生类) 我想在C++中像jQuery方式进行链式调用。样本: $('#obj').getParent().remove();

类型转换(来自派生类) 我想在C++中像jQuery方式进行链式调用。样本: $('#obj').getParent().remove();,c++,class,casting,types,C++,Class,Casting,Types,因此,据我所知,类的每个方法都应该返回指向自己的指针(如下所示) 在我调用基派生方法之前,一切都正常。守则: class Base { Base *base1() { return this; } Base *base2() { return this; } }; class Derived : Base { Derived *derived1() { return this; } Derived *derived2() { return this; } }; Der

因此,据我所知,类的每个方法都应该返回指向自己的指针(如下所示)

在我调用基派生方法之前,一切都正常。守则:

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返回基指针。有什么方法可以进行自动铸造吗


UPD:宏可能会这样吗?像

#define CORRECT_RETURN (this)


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

是。重写
Derived
中的
base1
base2
方法,将其返回值从
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
方法。每次都必须手动完成,否则就要编写大量的脚手架代码,使其看起来像是正在发生的事情,这通常比它的价值更麻烦。

不要忘记virtual on base。根据定义,您正在进行隐藏,因此不会得到多态性。对于这样的层次结构,虚拟方法可能是一个好主意,但实际上并不需要这样做
obj
是一个
派生的*
,所以
obj->derived1()
是一个
派生的*
,所以
obj->derived1()->base1()
调用
派生的::base1
(实际上返回一个
派生的*
),不管
base1
是否是虚拟的。@tyler mchenry回答得不错。请看一下更新,好吗?修改基类是不可能的,因为可能有无限多的派生类。宏对您没有帮助。如果你不想使用协方差,唯一的另一个答案就是做一个标准的向下转换:
dynamic\u cast(obj->derived1()->base1())->derived2()
,但我假设你已经知道了这一点,并且想要更好的语法。这根本不是“jquery方式”的功能。当然,没有办法去做你想做的事情。您试图在Base上调用的函数(在您调用base1()之后)当然必须在Base的接口内。我不确定您试图实现什么。如果它是将调用链接在一起,则可以在不使用继承的情况下添加无限。如果目标是生成正确类型的返回,则需要研究协方差或重载类型强制转换。签名“base()”意味着您将获得指向基的指针,这没有多大意义。应该更改方法名称以匹配它们提供的任何函数,而不是简单地作为“this”指针的getter。如果需要“this”指针,只需跳过getter即可。您仍然可以从任何函数返回“this”,并使用协方差(正如泰勒所建议的那样)。我怀疑
base1
base2
是否真的是这些方法的名称。它们很可能是匿名名称,只是为了表明它是在基类接口中声明的方法。因此,当对派生类对象调用函数时,返回指向派生类对象的指针应该没有语义问题。
class Derived : Base
{
   Derived *base1() { Base::base1(); return this; }
   Derived *base2() { Base::base2(); return this; }
   Derived *derived1() { return this; }
   Derived *derived2() { return this; }
};