C++ &引用;使用;使用基类名称更改访问权限是否有效?
我的朋友给我看了下面的代码C++ &引用;使用;使用基类名称更改访问权限是否有效?,c++,using-declaration,C++,Using Declaration,我的朋友给我看了下面的代码 struct A { virtual void f() = 0; virtual void g() = 0; }; struct AInternal : A { virtual void f() { /* ... */ } virtual void g() { /* ... */ } }; 他将AInternal用作实现大部分(如果不是全部A)的内部类。然后,他继承了AInternal,但由于他希望AInternal保持不可访问性(因为这是一个实现
struct A {
virtual void f() = 0;
virtual void g() = 0;
};
struct AInternal : A {
virtual void f() { /* ... */ }
virtual void g() { /* ... */ }
};
他将AInternal
用作实现大部分(如果不是全部A
)的内部类。然后,他继承了AInternal
,但由于他希望AInternal
保持不可访问性(因为这是一个实现细节),他继承了protected(根据实现)。他还做了使用
ing基类名称使A
可访问(默认情况下受保护,因为内部的
也被继承保护)
实际上,它工作得很好(但正如我们后来发现的,它仍然保持成员函数私有
——只是基类被设置为公共
),但它只在GCC上工作。它无法使基本A
可访问。有什么想法吗?我们甚至可以破解在叮当声上工作的代码
struct C : public AInternal {
protected:
using AInternal::A;
};
C *c = 0;
A *a = c; // error on GCC!
有人能帮忙吗?您只会影响注入类名的可见性。基本子对象或其成员的访问保护不应受到影响。如果Clang或GCC允许它影响基础中的强制转换有效性或访问,那就是他们的错误 [class.member.lookup]10.2/3说 在声明集中,使用声明被它们指定的成员替换,类型声明(包括注入的类名)被它们指定的类型替换
基类子对象在成员查找中没有名称;注入的类名确实如此。如果我理解正确,那么A定义了C提供的接口。我实际上没有理解整个设置背后的想法。它使得
AInternal
中的公共方法如果不存在于A
中,则无法访问,但可以在AInternal
中使用这些方法,并在C中继承公共方法。@pixelschemist的想法是使用AInternal::A使成员函数再次公开。这不起作用,但它做的是使基类A
可访问。是的,但我不明白这种布局的原因。为什么不让接口方法在内部公开,使用公共继承就可以了?像助手函数或其他成员这样的“实现细节”在AInternal
@AInternal中仍然是私有的,他只想保护中产阶级。我想更好的方法是为类内部创建一个using声明。但这失败了,因为这将是一个继承构造函数声明。我在自己的代码中遇到了一个例子,我错误地认为注入的类型名与引入它的基类具有相同的访问限定。事实证明,如果你真的依赖它,最好明确定义你自己的盐名,或者使用traits这个成语。谢谢!我完全不知道这些,因为基类的可见性,我开始睡不好觉+1.
struct C : public AInternal {
protected:
using AInternal::A;
};
C *c = 0;
A *a = c; // error on GCC!