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

C++ 我可以在派生类中使公共成员变量私有吗?

C++ 我可以在派生类中使公共成员变量私有吗?,c++,class,inheritance,C++,Class,Inheritance,我想在派生类中将基类中的公共成员设置为私有,如下所示: class A { public: int x; int y; }; class B : public A { // x is still public private: // y is now private using y; }; 但显然“使用”不能这样使用。在C++中有什么办法? (我不能使用私有继承,因为A的其他成员和功能必须仍然是公共的。)简短回答:不。Liskov替代和公共继承

我想在派生类中将基类中的公共成员设置为私有,如下所示:

class A {
public:
    int   x;
    int   y;
};

class B : public A {
    // x is still public
private:
    // y is now private
    using y;
};
但显然“使用”不能这样使用。在C++中有什么办法?


(我不能使用私有继承,因为A的其他成员和功能必须仍然是公共的。)

简短回答:不。Liskov替代和公共继承的性质要求您可以使用
A
(即其公共成员)执行的所有操作也可以由
B
完成。这意味着您不能隐藏公共方法

如果您试图隐藏公共
字段
,那么您无能为力。要“隐藏”公共方法,可以执行以下操作:

class B {
    // x is still public
    int x() { return a.x(); }
private:
    A a;
    // y is now private since you didn't add a forwarding method for it
};

是的,使用声明
技术上允许您这样做

您必须使用
使用A::y
而不是
使用y

但是,请认真评估这样做是否有设计意义

很少观察到:

  • 您的类不应具有公共数据。这应该尽可能避免。如果您坚持这个设计原则,您可能不需要在派生类中将其设为私有

  • 坚持。如果基类具有公共方法,并且除非您执行私有继承,否则如果派生类使用此类声明将基类方法设置为私有,则客户端将感到困惑


  • 这感觉像是一个笨拙的设计。即使您可以为类B执行此操作,所有人需要做的就是向上转换到指向a的指针或引用,然后他们就可以访问该成员