我有简单的代码,我认为那是失败的。

我已经从Shield私下继承了Sealer,甚至Shield不是它的friend,我仍然能够创建Shield的对象。

class Sealer
{
public:

    Sealer()
    {
        cout<<"base constructor;"<<endl;
    }

};

class Shield : private Sealer
{
public:

    void p()
    {
        cout<<"P gets called;"<<endl;
    }
};

int main()
{
    Shield d;  //success here
    d.p(); // here too
    return 0;
}


怎么可能?基类构造函数不应访问。是不是

我正在使用Visual Studio 2012。

最佳答案

class Shield : private Sealer表示Sealer中的所有内容在Shield中保持私有;在Shield之外或从其派生的类中无法看到它。

它不会神奇地返回并使Sealer的构造函数私有,以便Shield无法访问它。如果子类无法从基类访问任何内容,私有继承的意义是什么?它什么也做不了。

07-27 19:20