Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++_Inheritance - Fatal编程技术网

C++ 是否可以继承私有类但将成员公开?

C++ 是否可以继承私有类但将成员公开?,c++,inheritance,C++,Inheritance,我想让成员继承私人财产。我想我看到了一个公开的例子,但是这个事实是由private关键字派生的。我的问题是:如何做到这一点,如果可能的话,难道不应该禁止吗 class U{ public: int a; protected: int b; private: int c; }; class V : private U{ public: int i; //can make a public again? }; 您不能将c公开,因为它是U的私有对象,并且不能

我想让成员继承私人财产。我想我看到了一个公开的例子,但是这个事实是由private关键字派生的。我的问题是:如何做到这一点,如果可能的话,难道不应该禁止吗

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

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

您不能将
c
公开,因为它是
U
的私有对象,并且不能从
V
访问它(此外,可能需要它的设计有缺陷,因为它会违反封装-类不应该知道/关心其他类的
private
成员)

但是,
受保护的
公共
成员的情况并非如此,它们的访问级别可以通过
使用
声明被派生类覆盖。例如:

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
可从
V
U
外部的客户端代码访问:

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

尽可能使用
using
关键字

难道不应该禁止吗

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

class V : private U{
public:
    int i;
    //can make a public again?
};
没必要。您始终可以将成员返回其可访问性,但返回的次数不能超过最初的次数。所以,如果基类最初将某个东西声明为public,并且只是您的想法/限制将其私有化,那么如果您放弃此限制并将其保留为public,这不会损害基类,总之,它在一开始是public的。这里引用“C++编程语言”将最有帮助

不能使用using声明来访问附加的 信息。这仅仅是一种使人易于接近的机制 更方便使用的信息

所以,如果它在基类中是可访问的,并且您使用
protected
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;
}

您不能将
U::c
设置为公共,因为它是
U
U
的私有对象,因此无法从
V
访问它。如果它是
公共的
受保护的
,那么您可以使用
声明。因此,您可以将
U::a
U::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
};

不是真的。OP询问的是私有数据成员。OP询问的是
U::c
,它在
U
@KoKuToru中是私有的,这不是问题最初所说的,这就是为什么会有一些混乱的原因。@authority:哦,好吧。嗯,答案仍然有效:)