我的朋友向我展示了以下代码
struct A {
virtual void f() = 0;
virtual void g() = 0;
};
struct AInternal : A {
virtual void f() { /* ... */ }
virtual void g() { /* ... */ }
};
他AInternal
用作实现大多数(如果不是全部A
)的内部类。然后他继承自AInternal
,但由于他希望它AInternal
保持不可访问(因为它是一个实现细节),他继承了 protected (根据实现)。他还做的是using
ing 基类名称以使其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!
有人可以帮忙吗?