Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;使用;使用基类名称更改访问权限是否有效?_C++_Using Declaration - Fatal编程技术网

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!