Предположим, что у меня есть класс
class A {
protected:
int x,y;
double z,w;
public:
void foo();
void bar();
void baz();
};
определяется и используется в моем коде и в коде других. Теперь я хочу написать некоторую библиотеку, которая вполне может работать на A, но она на самом деле более общая и будет работать:
class B {
protected:
int y;
double z;
public:
void bar();
};
и я хочу, чтобы моя библиотека была общей, поэтому я определяю класс B и что его API-интерфейсы принимают.
Я хотел бы сказать компилятору - не в определении A, которое я больше не контролирую, а в другом месте, возможно, в определении B:
Посмотрите, пожалуйста, подумайте о
B
как о суперклассеA
. Таким образом, в частности, выложите его в памяти, чтобы, если я переосмыслитьA*
какB*
, мой код, ожидающийB*
, будет работать. И, пожалуйста, на самом деле принимайтеA*
какB*
(иA&
какB&
и т.д.).
В С++ мы можем сделать это другим способом, т.е. если B - это класс, который мы не контролируем, мы можем выполнить операцию "подкласс известного класса" с class A : public B { ... }
; и я знаю, что С++ не имеет противоположного механизма - "суперкласс" известного класса A новым классом B ". Мой вопрос: какая ближайшая достижимая аппроксимация этого механизма?
Примечания:
- Это все строго компилируемое время, а не время выполнения.
- Не может быть никаких изменений в
class A
. Я могу только изменить определениеB
и код, который знает обо всехA
иB
. Другие люди по-прежнему будут использовать классA
, и я тоже хочу, чтобы мой код взаимодействовал с ними. - Это должно быть "масштабируемо" для нескольких суперклассов. Возможно, у меня также есть
class C { protected: int x; double w; public: void baz(); }
, который также должен вести себя как суперкласс изA
.