12

2つのクラスがあるとしましょう:

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ですか? virtual20 以上の異なるクラスを継承しているため、関数を使用したくありません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

Hello()return を aにする必要はありませんB*Hello()を返すA*と、あなたがする必要があるのは、を呼び出すことができるようにあなたA*を aにキャストすることだけです。例えば:B*test.Hello()->World()

B* b = dynamic_cast<B*>(test.Hello());
if(b != 0) b->World();
于 2012-08-01T14:36:21.607 に答える
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 に答える