У меня есть объект S
.S
состоит из слоев S0
, S1
, S2
... точно так же, как стек стековых ящиков.
Я хочу создать цепочку шаблонных классов A
, B
, C
такой, что:
- Они представляют прокси для различных слоев объекта
S
. - Даже во время создания шаблона
C
может преобразовывать в B
, что может преобразовывать в A
. A
, B
и C
имеют разные наборыметодов.
Проблема в том, что если я использую публичное наследование, то C
получит методы A
и B
.
Тест:
#include <iostream>
// Library
template <typename T>
class A {
public:
void a() {std::cout << "a\n"; }
int s_{0};
};
template <typename T>
class B : public A<T> {
public:
void b() {std::cout << "b\n"; }
};
template <typename T>
class C : public B<T> {
public:
void c() {std::cout << "c\n"; }
};
// User of library write a function like this
template <typename T>
void foo(A<T>& a) { a.a(); }
// The problem:
int main() {
C<int> c;
foo(c);
c.a(); // <--- how to hide this?
return 0;
}