无法通过继承的Setter/Getter返回const char*变量 求代码修正方案
问题分析与修复方案
嘿,我一眼就看到问题出在哪了!你在Male::setName里犯了一个常见的局部变量遮蔽(variable shadowing)错误,导致父类的name成员根本没被赋值,这就是getName返回后没输出的原因。
先看你原代码里的setName实现:
void Male::setName(const char * s){ const char* name = s; // 这里创建了一个局部变量name,和父类的成员name毫无关系! std::cout << name << std::endl; }
这里你声明了一个局部变量name,它把父类Student里的protected成员name给"遮蔽"了——你只是给这个临时的局部变量赋值,父类的name成员始终是未初始化的状态,所以调用getName返回的是一个不确定的指针,自然没有输出内容。
修复后的完整代码
#include <iostream> using namespace std; class Student { public: char age; double height; double gpa; int getAge(); void setAge(int *); protected: const char * name; }; class Male : public Student { // 显式声明public继承,避免默认private继承带来的权限问题 public: void setName(const char * s); const char * getName(); }; void Male::setName(const char * s){ this->name = s; // 用this指针明确指向父类的成员name,也可以写成 Student::name = s; std::cout << name << std::endl; } const char * Male::getName(){ return this->name; // 返回父类的成员变量 } // 测试用例 int main() { Male student; student.setName("Mike"); cout << "获取到的名字:" << student.getName() << endl; return 0; }
额外注意事项
- 继承方式:C++中类默认是
private继承,这会导致父类的protected成员在子类中变成private权限,后续扩展可能受限,建议显式使用public继承。 - 指针生命周期:传递给
setName的const char*必须保证在调用getName时内存仍然有效,比如优先使用字符串常量(如"Mike"),如果用动态分配的内存,记得手动管理避免内存泄漏。
内容的提问来源于stack exchange,提问作者user4460837
相关产品推荐
相关产品推荐

