Мой друг показал мне следующий код
struct A {
virtual void f() = 0;
virtual void g() = 0;
};
struct AInternal : A {
virtual void f() { /* ... */ }
virtual void g() { /* ... */ }
};
Он использует AInternal
как внутренний класс, который реализует большую часть (если не все A
). Затем он унаследовал от AInternal
, но поскольку он хотел, чтобы AInternal
оставалось недоступным (поскольку это деталь реализации), он наследует защищенный (реализованный в терминах). Он также using
изменил имя базового класса, чтобы сделать A
доступным (по умолчанию он был защищен, так как AInternal
также был унаследован защищенным)
struct C : protected AInternal {
using AInternal::A;
};
На самом деле, это сработало нормально (но, как мы позже выяснили, функции-члены остались private
- был создан только базовый класс public
), но это работало только на GCC. Не удается сделать базу A
доступной. Любая идея? Мы могли бы даже взломать код, работающий на Clang.
struct C : public AInternal {
protected:
using AInternal::A;
};
C *c = 0;
A *a = c; // error on GCC!
Может кто-нибудь помочь, пожалуйста?
AInternal
недоступными, если они не присутствуют вA
, но можно просто сделать такие методы закрытыми вAInternal
и наследовать общедоступные в C. - person Pixelchemist   schedule 14.07.2013using AInternal::A
снова сделать функции-члены общедоступными. Это не сработало, но оно сделало сделало доступным базовый классA
. - person Johannes Schaub - litb   schedule 14.07.2013AInternal
, использовать публичное наследование и все будет в порядке? Детали реализации, такие как вспомогательные функции или другие члены, могут оставаться закрытыми вAInternal
. - person Pixelchemist   schedule 15.07.2013