5

我想让成员继承私有。我想我看到了一个将它们公开的例子,但是这个事实是用 private 关键字派生的。我的问题:怎么做,如果可能的话,不应该禁止吗?

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

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

3 回答 3

6

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

protected但是, andpublic成员却不是这样,派生类可以通过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

};

以上内容b可以从Vand外部的客户端代码访问U

int main()
{
    V v;
    v.a = 42; // OK
    v.b = 1729; // OK
}
于 2013-05-04T15:02:05.193 回答
5

怎么做?

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

不应该禁止吗?

没必要。您始终可以将成员的可访问性返回,但不能超过最初的访问权限。因此,如果基类最初已将某些内容声明为公开,并且将其设为私有只是您的想法/限制,那么如果您放弃此限制并将其保留为公开,这不会损害基类,总而言之,它是公开的开始。引用“C++ 编程语言”将在这里得到最好的帮助。

using-declaration 不能用于访问附加 信息。它只是一种使可访问信息更方便使用的机制。

因此,如果它可以在基类中访问,并且您使用protectedor关键字派生了您的类,则可以删除此限制并通过将它们“传输”到派生类定义中的private适当部分 () 将它们返回到其初始访问级别。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;
}
于 2013-05-04T15:02:56.057 回答
3

你不能U::c公开,因为它是private给 的U,所以它不能从V. 如果是publicor protected,那么你可以通过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
};
于 2013-05-04T15:03:03.353 回答