あなたの例に相当する C++ は次のようになります。
// A.hpp
#include "B.hpp"
class A : public BDelegate {
public:
void classBSays ( ) { }
B* b;
};
// B.hpp
class BDelegate {
public:
virtual void classBSays( ) = 0;
};
class B {
public:
void f ( ) { delegate->classBSays( ); }
BDelegate* delegate;
};
簡潔にするために、ここではメンバー関数のインライン実装を使用していることに注意しA.classBSays()
てください。B.f()
A.cpp
B.cpp
この例では、クラスはプロトコルBDelegate
に相当する抽象基本クラス (ABC)です。BDelegate
純粋な仮想メンバー関数 (キーワードvirtual
と接尾辞が前に付いた関数) のみを含めることにより、Objective-C プロトコルでタグを使用する (またはタグ=0
を使用しない) 場合と同様に、そのサブクラスにそれらのメソッドの実装を提供するように強制します。@required
そのような機能だけが含まれているという事実がBDelegate
ABCなのです。
ABC の関数に空の本体を指定することで、Objective-C タグをエミュレートでき@optional
ます。これは、サブクラスを実装する必要がないことを意味します (ABC に実装されているため)。たとえば、次foo
のように を変更して、オプションのメソッドをエミュレートできます。BDelegate
@protocol BDelegate
- (void) classBsays;
@optional
- (void) foo;
@end
// Is approximately equivalent to:
class BDelegate {
public:
virtual void classBSays( ) = 0;
virtual void foo( ) { }
};
その定義を使用して、クラスは必要に応じA
て定義を提供するかどうかを選択できますfoo
。ただし、独自のオーバーライドを提供しない場合でものメソッドを継承する@optional
ため、これは Objective-C 表記と完全に同等ではないことに注意してください。一方、Objective-C プロトコルでは、それ自体を明示的に実装しない限り、そのようなメソッドはまったくありません。A
BDelegate
foo
A
このテーマのより完全な紹介は、ここで入手できます。