You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过继承的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:36:16