12

假设我有两个课程:

class A
{
    public:
    A* Hello()
    {
        return this;
    }
}

class B:public class A
{
    public:
    B* World()
    {
        return this;
    }
}

假设我有一个这样的B类实例:

B test;

如果我打电话test.World()->Hello()那会很好。但是由于返回类型test.Hello()->World()而不起作用。Hello()A

我怎样才能Hello()返回类型B?我不想使用virtual函数,因为我们有 20 多个不同的类继承A.

4

3 回答 3

22

您可以使用CRTP,一种奇怪重复的模板模式:

template<class Derived>
class A {
public:
    Derived* Hello() {
        return static_cast<Derived*>(this);
    }
};

class B : public A<B> {
public:
    B* World() {
        return this;
    }
};

   
int main() {
    B test;
    test.World()->Hello();
    test.Hello()->World();
}
于 2012-08-01T14:35:26.617 回答
0

您可以在 B 中使用另一个 Hello 方法,即使它不是虚拟的:

class A
{
    public:
    A* Hello() { return this; }
}

class B:public class A
{
    public:
    B* Hello() { return this; }
    B* World() { return this; }
}
于 2012-08-01T14:34:12.710 回答
0

没有必要让Hello()return a B*Hello()正在返回 an A*,您需要做的就是将您的A*转换为 aB*以便能够调用test.Hello()->World()。例如:

B* b = dynamic_cast<B*>(test.Hello());
if(b != 0) b->World();
于 2012-08-01T14:36:21.607 回答