在派生类中创建构造函数时

时间:2020-09-20 11:26:49

标签: c++

在派生类中创建构造函数时, 使用基类的私有成员变量, 可以将其作为派生类的构造函数参数的初始值吗?

class Base{
    private: int m_Par;
    protected: int m_Pro;
    public:int m_Pub;
};
class Derived :public Base{
    public:Derived(int m_Par=1,int m_Pro=2,int m_Pub=3);
           void Func();
};
Derived::Derived(int m_Par,int m_Pro,int m_Pub)
{
    //this->m_Par=m_Par;
    this->m_Pro=m_Pro;
    this->m_Pub=m_Pub;
}

我记得派生类无法访问基类的私有成员变量, 但是,我想知道为什么将基本函数的私有成员变量作为派生类参数的初始值给出时没有错误。

3 个答案:

答案 0 :(得分:0)

您正在编译注释掉的行吗?因为当我使用g ++进行编译时,编译器会抱怨以下错误。

derived.cpp: In constructor ‘Derived::Derived(int, int, int)’:
derived.cpp:12:11: error: ‘int Base::m_Par’ is private within this context
this->m_Par=m_Par;
       ^~~~~
derived.cpp:2:18: note: declared private here
private: int m_Par;

答案 1 :(得分:0)

参数不是字段。当您将参数名称写入派生类构造函数(如Derived(int m_Par=1,int m_Pro=2,int m_Pub=3))时,它与字段不匹配。您可以根据需要将字段与函数主体中的参数进行匹配。

如果要在基类中初始化私有字段,可以使用类似的内容。

class Base{
    private: int m_Par;
    protected: int m_Pro;
    public:int m_Pub;

    Base(int m_Par){
        this->m_Par = m_Par;
    }

    int getM_Par(){
        return this->m_Par;
    }
};
class Derived :public Base{
    public:Derived(int m_Par=1,int m_Pro=2,int m_Pub=3);
           void Func();
};
Derived::Derived(int m_Par,int m_Pro,int m_Pub) : Base(m_Par)
{
    this->m_Pro=m_Pro;
    this->m_Pub=m_Pub;
}

int main(){
   Derived d(10,5,3);
   std::cout<<"M_Par value: "<<d.getM_Par();
   return 0;
}

编辑: 在下面的代码中,您编写了this->m_Pro = m_Pro;this->m_Pub=m_Pub;。这些代码块将从参数中获取的值分配给您的基类字段。当您编写Derived :: Derived(int m_Par =1, int m_Pro=2, int m_Pub=3)时,您正在做的是,如果用户未将任何参数传递给该函数,则您的参数将具有您分配的默认值。因此参数和字段不相同。您在基类中编写的字段属于基类,而参数是局部变量则属于您传入的函数。

Derived::Derived(int m_Par,int m_Pro,int m_Pub) : Base(m_Par)
{
    this->m_Pro=m_Pro;
    this->m_Pub=m_Pub;
}

答案 2 :(得分:0)

首先,m_Par是构造函数中的局部变量,与m_Par类的成员Base没有任何关系。为了访问与本地变量同名的成员,请使用this->m_Par。但是,您无法在private类的构造函数中访问Base类的Derived个成员。

我认为您在混合local variablesclass members的命名约定时只会使问题复杂化。前缀m_通常添加到类成员的名称中:

Base(int par){
    this->m_Par = par;
}

Derived::Derived(int par,int pro,int pub) : Base(par)
{
    this->m_Pro = pro;
    this->m_Pub = pub;
}
相关问题