我的朋友给我展示了以下代码
struct A {
virtual void f() = 0;
virtual void g() = 0;
};
struct AInternal : A {
virtual void f() { /* ... */ }
virtual void g() { /* ... */ }
};
他使用
AInternal
作为一个内部类,实现了大部分(如果不是全部)A
的功能。然后他从AInternal
继承,但由于他希望AInternal
保持不可访问(因为它是一个实现细节),所以他继承了受保护的实现方式。他还使用了基类名称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中继承公共方法。 - Pixelchemistusing AInternal::A
将成员函数重新设为公共的。这个方法并没有奏效,但确实使得基类A
可以被访问到了。 - Johannes Schaub - litbAInternal
中将接口方法设为公共的,使用公共继承就可以了呢?"实现细节",如辅助函数或其他成员仍然可以在AInternal
中设置为私有。 - Pixelchemist