当前位置:  开发笔记 > 编程语言 > 正文

从子类访问私有继承类的名称

如何解决《从子类访问私有继承类的名称》经验,为你挑选了1个好方法。



1> Lightness Ra..:

这是一个很好的错误!

在上下文中C," A"表示" 我从我的基地获得的注入类名 A ".
你可以把它想象成C::B::A.
当然,由于私有继承,该基础是无法访问的:

class A {};

class B : private A {
public:
   B() {}
   B(const A&) {}  
};

class C : public B {
public:
   C(const A&) {}
};

int main()
{
   A a;
   B b(a);
   C c(a);
}

// main.cpp:11:13: error: 'class A A::A' is inaccessible within this context
//      C(const A&) {}
//              ^
// main.cpp:1:9: note: declared here
//  class A {};
//        ^

(现场演示)

您可以通过调用它来修复此问题::A,采用更间接的路径来实际命名完全相同的类型:

class A {};

class B : private A {
public:
   B() {}
   B(const A&) {}  
};

class C : public B {
public:
   C(const ::A&) {}
};

int main()
{
   A a;
   B b(a);
   C c(a);
}

// OK

(现场演示)


顺便说一下,完全相同的逻辑适用于private继承的成员变量:

int x = 1;

class A
{
private:
   int x = 2;
};

class B : A {
public:
   B() { int y = x; }
};

int main()
{
   A a;
   B b(a);
}

// main.cpp: In constructor 'B::B()':
// main.cpp:11:17: error: 'int A::x' is private within this context
//    B() { int y = x; }

(现场演示)

这一切看起来都很愚蠢,但这可能是一个很好的理由.


在你的情况下,然后:

Container2(const ::QByteArray &ba);


"从表面看来这一切看起来都很愚蠢,但这可能是一个很好的理由." 原因是:名称查找始终在访问控制之前进行.意味着将成员从私有变为公共不会悄然改变程序的含义(例如,在你的第二个例子中,有一天它从读取`:: x`变为'A :: x`).
可爱.非常可爱.
@Galen:我几乎在每一篇我写这篇文章的时候都会这样做;)
推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有