自动初始化父类和子类中的成员变量[重复]

Posted

技术标签:

【中文标题】自动初始化父类和子类中的成员变量[重复]【英文标题】:Automatically Initializing a member variable in the parent class and the child class [duplicate] 【发布时间】:2020-10-14 21:52:23 【问题描述】:

您好 *** 社区,我需要您的帮助!我目前正在学习继承,我有一个简单的两个类层次结构,“User”作为父类,“Admin”作为子类。在“用户”类的受保护中,我有成员变量“std::string m_sRank”,并希望它自动初始化为与类名对应的等级 - 即“用户”。由于某些原因,在子类“Admin”中,尽管成员变量处于“受保护”范围内,但我无法将 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);

【问题讨论】:

【参考方案1】:

是的,您不能以这种方式初始化父属性。您需要以这种方式调用父构造函数。请注意,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/

【讨论】:

以上是关于自动初始化父类和子类中的成员变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

[Java] 父类和子类拥有同名的成员变量(fields)的情况

java基础知识十一

父类和子类有相同成员变量时的例子

成员变量的隐藏,方法的覆盖,super关键字

java 父类static变量 子类能集成吗

父类的成员变量赋了值,子类继承该变量,值还是父类的值吗?