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

C++ 在什么情况下继承私有成员会有用?

C++ 在什么情况下继承私有成员会有用?,c++,C++,我不明白为什么会有人想继承私人成员 例如: class Secretive { private: int a; public: Secretive() { a = 0; } private: int showSecret () { return a; }; }; class Curious:public Secretive { .... } 你能给我举一个具体的例子,说明继承私有成员是有用的吗?您将如何访问这些私有成员

我不明白为什么会有人想继承私人成员

例如:

class Secretive {
    private: 
       int a;
    public:
       Secretive() { a = 0; }
    private: 
       int showSecret () { return a; };
};

class Curious:public Secretive 
{ ....  }

你能给我举一个具体的例子,说明继承私有成员是有用的吗?您将如何访问这些私有成员?

私有成员函数实际上不是继承的,您不能在子类中访问它们。(除非您使用的是重载的私有虚拟成员函数——在这种情况下,您不能访问基类成员函数,但它仍然是继承的,但它有其他用例)

但无论如何,您希望它们在基类中,因为它们被基类中的其他私有/受保护成员函数使用(直接或以链接方式)。如果它没有被任何其他成员函数使用,您可以将其作为未使用的代码删除


在Herb Sutter中,还建议并解释了私有虚拟成员函数的使用。

您可以肯定地拥有一个基类,该基类具有派生类间接使用的私有函数:

class Base
{
    private:
       int x;
    public:
       Base() : x(0) {}
       int func() { pfunc(); return x; }
    private:
       void pfunc() { x++; }
};


class Derived : public Base
{
 private:
   int y;
 public:
   Derived() y(2) {}
   int dfunc()  { return y + func(); }
};


... 

Derived d;
cout << "dfunc = " << d.dfunc() << endl;
类基
{
私人:
int x;
公众:
Base():x(0){}
int func(){pfunc();返回x;}
私人:
void pfunc(){x++;}
};
派生类:公共基
{
私人:
int-y;
公众:
派生()y(2){}
int-dfunc(){返回y+func();}
};
... 
导出d;

cout私有成员用于实现类的不变量。当您从具有不变量的类继承时,您可以访问该类的公共(和受保护)接口,以便其不变量仍然保持不变。如果关系的类型为is-a而不是contains-a,则您希望继承而不是简单地添加字段

例如,您有一个Galaxans类型的游戏。您有一个基类
GameObject
,其中包含私有成员
position
sprite
、图形资源本身等等;和公众成员
移动,
绘制

主飞船将是
GameObject
的子类,但如果不直接修改精灵,则会破坏基类所做的所有资源管理。相反,您可以像使用任何其他类一样使用公共接口


你需要主飞船是
GameObject
的一个子类,这样它才能成为游戏列表的一部分。

你不能成为基类的私有成员。不过,你可以在C++中重写它们,虽然我从来没有看到过这一点。


因此,为了回答您的问题:不,我不能给您一个示例,说明您为什么希望“继承”私有成员。

私有成员函数可以包含基本实现的公共接口使用的实用程序或公共功能。它们的存在并不意味着它们适合于派生类使用

将成员变量设置为私有允许访问器和mutator函数限制它们的使用方式以及成员变量可以保存的值。例如,如果您的基类维护一个指向对象的指针,并且希望防止将该成员变量设置为
nullptr

class FooBase
{
public:
    void setPointer(std::unique_ptr<int> ptr)
    {
        if(ptr.get() == nullptr)
        {
            // do something like throw an exception or set a default

        }
        else
        {
            var_ = std::move(ptr);
        }
    }

private:
    std::unique_ptr<int> var_;
};
class-FooBase
{
公众:
void setPointer(std::unique_ptr ptr)
{
if(ptr.get()==nullptr)
{
//执行诸如抛出异常或设置默认值之类的操作
}
其他的
{
变量=标准::移动(ptr);
}
}
私人:
std::unique_ptr var;
};

对于这类问题,有些人首先想到的是,语言可能不够清晰。特别是,不清楚遗传对不同的人意味着什么

类型为“好奇”的对象包含类型为“秘密”的子对象,而该子对象又包含成员
a
。从这个意义上说,
好奇
确实包含
a
,因此它以某种方式继承了它

好奇
完整对象无法直接访问
秘密
子对象中的
子对象,因此有些人可以说它没有
成员。它在那里,但在
好奇
中并不真正可用。对于那些好奇的人来说,
不会继承
a

为什么有人会在一个要扩展的类中将事物声明/定义为
private

答案很简单,尽可能简单。出于完全相同的原因,您可以在任何其他地方将任何内容设置为私有。
private
访问说明符用于标记属于实现详细信息的类型的成员,这些成员不在该特定类型之外使用,无论是完全无关的类型还是派生类型都没有区别

私有成员是为满足您的类型需要而存在的(而不是为其他类型),
Secretive
需要它们来实现某些功能,这些功能要么公开给所有类型,要么只通过
protected
访问说明符公开给派生类型。但是这些函数不能被其他任何人使用,在某些情况下,它们可能会暂时破坏类型的不变量


考虑一个以某种方式人为的例子,一个向量的实现,它打算以某种方式进行扩展。它可能有一个指针,指向所有(包括派生类型)都可以访问的数据、大小和容量,但不能从外部修改。它可以有
grow\u if\u need
移动现有的\u元素
任何其他的\u助手
,使向量处于无效状态(不变量被破坏),但在适当使用时(从向量内部的函数)从向量的一个有效状态变为另一个有效状态。这些函数不应该被外部访问,就好像它们破坏了不变量一样,但它们可以用来破坏和简化实现中的代码。

私有成员由父类使用……派生类不能直接访问它们。你并不是真的继承了私人成员。@minitech,