微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自动初始化父类和子类中的成员变量

如何解决自动初始化父类和子类中的成员变量

您好Stackoverflow社区,我需要您的帮助!我正在学习继承,目前我有一个简单的两类层次结构,“ User”作为父类,“ Admin”作为子类。在“用户”类中受保护的情况下,我具有成员变量“ std :: string m_sRank”,并希望将其自动初始化为与类名称相对应的等级-即“用户”。由于子类“ Admin”的某种原因,尽管成员变量在“ protected”范围内,但我无法将m_sRank初始化为“ Admin”。我在类和初始化列表中都使用了构造函数。有人可以为我提供解决方案,因为我已经花了数小时尝试。任何帮助将不胜感激。我希望我已经充分解释了自己,并且很高兴澄清我是否没有道理。

class clsUser
{
    private:

protected:
    std::string m_sRank;
public:
     //IT WORKS HERE! I can automatically set the "User" class member variable to "Admin"
    clsUser() : m_sRank("User"){}
};



class clsAdmin : public clsUser
{
private:
public:
     //Doesn't work here despite "m_sRank" being in the protected scope in the parent class
    clsAdmin() :m_sRank("Admin") {}
};


void displayUserDetails(clsUser *objAdmin) 
{
    std::cout << "***" << std::endl;
    std::cout << "Name: " << objAdmin->GetName() << std::endl;
    std::cout << "Age: " << objAdmin->GetAge() << std::endl;
    std::cout << "Rank: " << objAdmin->GetRank() << std::endl;
    std::cout << "***" << std::endl;
}


int main()
{
    clsUser objUser();
    clsAdmin objAdmin();

    displayUserDetails(&objUser);

    displayUserDetails(&objAdmin);

解决方法

是的,您不能以这种方式初始化父级属性。您需要以这种方式调用父构造函数。请注意,string m_sRank也可以是const,因为它是由成员初始化程序列表初始化的:

using std::string;

class clsUser
{
...
protected:
    string m_sRank;

public:
    clsUser() : m_sRank("User"){}
    explicit clsUser (string const&& rank) : m_sRank(rank) {}
...
};



class clsAdmin : public clsUser
{
...
public:
    clsAdmin() : clsUser("Admin") {}
...
};


您可能会注意到使用了explicit关键字,请参阅本文以获取对导致所有所有单参数构造函数都推荐使用此特例的解释: http://sjbrown.co.uk/2004/05/01/always-use-explicit/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。