我想要一个C ++类方法来返回对同类对象的引用。这也适用于派生类。在下面的例子中,我简单地将'A *'作为函数的返回类型,但这在使用B类时显然是一个问题。
class A {
public:
A* self() { return this; };
};
class B: public A {
};
int main(int argc, char **argv) {
A* a1 = new A;
B* b1 = new B;
A* a2 = a1->self();
B* b2 = b1->self();
}
编译器抱怨
class.cpp:在函数'int main(int,char **)'中:class.cpp:16:错误:
无效转换为“A *”到“B *”
在Objective-C中我会使用instanceof
特殊类型作为返回类型。是否有类似的用于C ++或任何已知的模式用于此类问题?
答案 0 :(得分:4)
我想你需要"return type relaxation"(注意virtual
):
struct A {
virtual A* self() { return this; };
};
struct B: A {
B* self() { return this; };
};
您也可以考虑this question
这种语言特性专门针对具有类的并行层次结构的情况而引入(clone
是特殊情况)
答案 1 :(得分:1)
转换确实无效。对于此类转换,您需要转换:
B* b2 = static_cast<B*>( b1->self() );
但正确的方法是尽量避免陷入这种情况,无论是通过适当的设计还是重构。