使用作用域解析运算符初始化基类成员的技术问询
关于派生类构造函数初始化基类成员的正确姿势
嘿,这个问题问到点子上了——咱们先把核心逻辑和错误原因理清楚,再给你正确的实现方式:
首先,先看你给出的原始类声明:
class Animal{ private: char* m_sound; public: Animal(char* s); }; class Cat : public Animal{ private: char* m_name; public: Cat(char* n, char* s); };
你尝试的构造函数定义里,Cat::Cat直接初始化m_sound的写法是行不通的:
// 基类构造函数是对的 Animal::Animal(char* s) : m_sound(s){ } // 这里会编译报错! Cat::Cat(char* n, char* s) : m_name(n), m_sound(s){ }
为什么这个写法不行?
关键点在于:基类的私有成员(m_sound)只能被基类自身访问和初始化,哪怕是它的派生类Cat也没有直接操作的权限——作用域解析运算符(::)也帮不了你突破这个访问限制,它的作用只是明确某个成员属于哪个类,而不是提升访问权限。
正确的实现方式:调用基类构造函数
要初始化基类的成员,派生类的构造函数必须在初始化列表中调用基类的构造函数,让基类自己去完成私有成员的初始化。正确的代码应该是这样:
// 基类构造函数的定义没问题 Animal::Animal(char* s) : m_sound(s) { } // 派生类构造函数先调用基类构造函数,再初始化自己的成员 Cat::Cat(char* n, char* s) : Animal(s), m_name(n) { }
这里的Animal(s)就是在Cat对象创建时,先调用Animal类的构造函数,把参数s传递给它,由Animal自己初始化m_sound。这才是符合C++访问权限规则的正确做法,而且完全用到了作用域解析运算符来明确构造函数的归属(Animal::Animal和Cat::Cat)。
额外小建议
考虑到字符串常量的安全性,现在C++里更推荐用const char*替代char*来处理字符串参数,避免不必要的类型转换风险哦。
内容的提问来源于stack exchange,提问作者Tiffany Montgomery
相关产品推荐
相关产品推荐

