我有一个对象 S
。 S
由 S0
、S1
、S2
层组成……就像一堆可堆叠的抽屉。
我想创建一个模板类链 A
, B
, C
这样:
- 它们代表
S
对象不同层的代理。 - 即使在模板实例化期间,
C
也可以转换为B
,B
可以转换为A
。 A
、B
和C
具有不同的方法集。
问题是,如果我使用公共(public)继承,那么 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;
}
最佳答案
我不确定我是否明白你想要什么。但一种方法是更改派生类中基类成员的访问级别。例如:
template <typename T>
class C : public B<T> {
public:
void c() { std::cout << "c\n"; }
private:
using A::a; // <-- reduce access level of base class member
};
关于c++ - 类链中的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50281362/