好友父类不能访问子类中的私有构造函数

Friend parent class cannot access private constructor in child

本文关键字:构造函数 子类 父类 不能 访问 好友      更新时间:2023-10-16

我想创建一个父类Base,它的子类Derived1, Derived2等有工厂。Base及其所有派生类的构造函数应该是私有的。我试着这样做:

base.h:

class Derived1;    
class Base
{
    protected:
        Base ();
    public:
        Base *createDerived1 ();
}
#include "derived1.h"

derived1.h:

#include "base.h"    
class Derived1 : public Base
{
    friend class Base;
    private:
        Derived1 ();
}

derived1.cpp:

Derived1::Derived1 ()
    : Base ()
{
}

base.cpp:

Base *Base::createDerived1 ()
{
    return new Derived1 (); // error C2248: 'Derived1::Derived1' : cannot access private member declared in class 'Derived1'
}

然而,我不能访问工厂内部的私有构造函数,尽管将Base声明为Derived1的友类。我做错了什么,或者没有可能有父类作为朋友,我应该使Derived类的构造函数公开?

下面的代码为我工作:

//B.h 
class D;
class B{
protected:
  B(){}
public:
static  B* f();
};
//D.h
class D: public B{
 friend class B;
  private:
  D():B(){}
};
//B.cpp
B*  B::f(){
 D *d=new D;
 return d;
}

你的一个bug是由另一个回复确定的。另一个是工厂方法应该是static,因为您将无法创建Base对象,因为它具有私有构造函数。

这确实是我的一个愚蠢的错误,我写道:

Base *createDerived1 ()
{
    return new Derived1 (); // error C2248: 'Derived1::Derived1' : cannot access private member declared in class 'Derived1'
}
不是

Base *Base::createDerived1 ()
{
    return new Derived1 (); // everything fine
}

当然,私有构造函数不能从全局作用域访问。