【发布时间】:2013-07-12 14:18:40
【问题描述】:
我的朋友给我看了下面的代码
struct A {
virtual void f() = 0;
virtual void g() = 0;
};
struct AInternal : A {
virtual void f() { /* ... */ }
virtual void g() { /* ... */ }
};
他使用AInternal 作为实现大部分(如果不是全部A)的内部类。然后他从AInternal 继承,但由于他希望AInternal 保持不可访问状态(因为它是一个实现细节),所以他继承了protected(根据of 实现)。他还做了usinging 基类名称以使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!
有人可以帮忙吗?
【问题讨论】:
-
如果我做对了,那么 A 定义了由 C 提供的接口。我实际上不明白的是整个设置背后的想法。如果
A中不存在,它会使AInternal中的公共方法无法访问,但可以在AInternal中将此类方法设为私有并在C 中继承公共方法。 -
@Pixelchemist 的想法是让
using AInternal::A再次公开成员函数。这不起作用,但它确实 所做的是使基类A可访问。 -
是的,但我不明白这种布局的原因。为什么不在
AInternal中公开接口方法,使用公共继承就可以了?诸如辅助函数或其他成员之类的“实现细节”仍然可以在AInternal中私有。 -
@ainternal 他希望只保护中产阶级。我想更好的方法是为 AInternal 类做一个 using 声明。但这失败了,因为它将是一个继承的构造函数声明。
标签: c++ using-declaration