gpt4 book ai didi

c++11 - 自动初始化父类和子类中的成员变量

转载 作者:行者123 更新时间:2023-12-04 08:45:10 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How can I initialize base class member variables in derived class constructor?

(8 个回答)


11 个月前关闭。




嗨 Stackoverflow 社区,我需要你的帮助!我正在学习继承,目前我有一个简单的两个类层次结构,“User”作为父类,“Admin”作为子类。在“User”类的protected 中,我有成员变量“std::string m_sRank”,并希望它自动初始化为与类名对应的等级——即“User”。出于某种原因,尽管成员变量在“ protected ”范围内,但在子类“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);

最佳答案

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

关于c++11 - 自动初始化父类和子类中的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64362013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com