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
и с суффиксом =0
), он заставляет его подклассы предоставлять реализации для этих методов, так же, как использование тега @required
(или никакого тега) в протоколе Objective-C , Тот факт, что BDelegate
содержит только такие функции, является тем, что делает его ABC.
Вы можете эмулировать тег Objective-C @optional
, указав пустой объект для функции в вашей ABC, что означает, что подклассы не требуются для его реализации (поскольку он реализован в 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
или нет, как это желательно.Обратите внимание, однако, что это не совсем эквивалентно нотации Objective-C @optional
, потому что A
по-прежнему наследует метод , если он не обеспечивает его собственное переопределение. С помощью протокола Objective-C, с другой стороны, A
вообще не будет иметь такого метода, если он явно не реализует его сам.
Более подробное введение в тему доступно here.
Класс C++ с только чистыми виртуальными функциями-членами (см. [This] (http://stackoverflow.com/questions/318064) для базового ввода) примерно эквивалентен протоколу Objective-C. – Mac