在C ++中返回与类相同的类型

时间:2014-04-28 08:17:58

标签: c++

我想要一个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 ++或任何已知的模式用于此类问题?

2 个答案:

答案 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() );

但正确的方法是尽量避免陷入这种情况,无论是通过适当的设计还是重构。