继承:返回自我类型的函数?

时间:2012-08-01 14:31:27

标签: c++

假设我有两个班级:

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

3 个答案:

答案 0 :(得分:18)

您可以使用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();
}

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

没有必要让Hello()返回B*Hello()正在返回A*,您需要做的就是将A*投放到B*,以便能够致电test.Hello()->World()。例如:

B* b = dynamic_cast<B*>(test.Hello());
if(b != 0) b->World();