这是否有可能继承私人班级但公开会员?

时间:2013-05-04 15:00:23

标签: c++ inheritance

我希望成员继承私有。我想我看到了一个将它们公之于众的例子,然而这个事实是由私人关键字衍生出来的。我的问题:怎么做,如果有可能,那么不应该被禁止吗?

class U{
public:
    int a;
protected:
    int b;
private:
    int c;
};

class V : private U{
public:
    int i;
    //can make a public again?
};

3 个答案:

答案 0 :(得分:6)

您无法公开c因为U是私有的,而且无法从V访问(此外,需要的设计可能存在缺陷,因为它会违反封装 - 一个类不应该知道/关心其他类的private成员。

但是,protectedpublic成员的情况也是如此,其访问级别可以通过using声明被派生类覆盖。例如:

class V : private U{
public:
    int i;

    using U::a;
//  ^^^^^^^^^^^ Gives "a" public accessibility 

    using U::b;
//  ^^^^^^^^^^^ Gives "b" public accessibility

    // using U::c; // ERROR! c is not accessible from V

};

上述内容可以bVU外部的客户端代码访问:

int main()
{
    V v;
    v.a = 42; // OK
    v.b = 1729; // OK
}

答案 1 :(得分:5)

  

怎么做?

完全可能,请使用using关键字。

  

不应该被禁止吗?

没有必要。您可以随时向返回成员返回其可访问性,但不超过最初的。所以,如果基类最初声明了一些公共内容,并且只是你的想法/限制使它成为私有的,如果你放弃这个限制并将其保留为公共,这不会损害基类,总而言之它是​​公开的一开始。引用“C ++编程语言”将有助于此。

  

使用声明不能用于访问附加   信息。它只是使可访问性的机制   信息使用更方便

因此,如果它可以在基类中访问,并且您使用protectedprivate关键字派生了类,则可以删除此限制并通过“传输”它们将其返回到初始访问级别派生类定义中的适当部分(public,protected,private)。

class U{
public:
    int a;
protected:
    int b;
private:
    int c;
};

class V : private U{
public:
    using U::b;
    using U::a;
};

int main(int argc, char** argv) {

    V v;
    printf("\nV: %d %d %d",v.a,v.a,v.b);

    U u;
    printf("\nU: %d %d %d",u.a,u.a,u.a);

    return 0;
}

答案 2 :(得分:3)

您无法公开U::c,因为它是privateU,因此无法从V访问它。如果是publicprotected,那么您可以使用using声明。因此,您可以公开U::aU::b,但不能公开U::c

class V : private U{
public:
    int i;
    //can make c public again?
    using U::c; // ERROR: only if U::c is public or protected in U
    using U::a; // OK
    using U::b; // OK
};
相关问题