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

C++派生类修改基类成员变量并通过继承方法打印的实现问题

问题根因

你当前的代码无法实现预期效果,核心是两个C++基础语法问题:

  • 成员变量不存在“继承覆盖”的特性:父类Print中定义的name和子类Human中定义的name是两块完全独立的内存空间,父类的打印方法默认只会访问父类作用域下的name,不会读取子类的同名成员。
  • C风格字符数组不支持直接用=赋值字符串常量,你写的h.name = "Somename"本身就是非法语法,无法通过编译。
实现方案

根据使用场景,提供两种可直接运行的正确实现:

方案1:成员上提(最简洁,适配当前需求)

既然打印逻辑是通用能力,直接把name成员统一定义在父类Print中,子类直接继承复用即可,不需要重复定义同名变量,同时按需求将打印方法命名为printName:

#include <iostream>
#include <cstring>

class Print {
public:
    char name[255];
    void printName() {
        std::cout << name << std::endl;
    }
};

class Human : public Print {
    // 直接复用父类的name成员,无需重复定义
};

int main() {
    Human h;
    // 字符数组赋值需要用strcpy做内存拷贝
    strcpy(h.name, "Somename");
    h.printName(); // 输出:Somename
    return 0;
}

如果不想处理C风格数组的拷贝问题,可以直接用std::string存储名字,写法更简洁:

#include <iostream>
#include <string>

class Print {
public:
    std::string name;
    void printName() {
        std::cout << name << std::endl;
    }
};

class Human : public Print {};

int main() {
    Human h;
    h.name = "Somename";
    h.printName(); // 输出:Somename
    return 0;
}

方案2:多态实现(适合后续扩展场景)

如果后续你需要有多个不同的类复用Print的打印能力,且不同类的名字获取逻辑存在差异,可以通过虚函数实现多态,让父类的打印方法自动调用子类的名字获取逻辑:

#include <iostream>
#include <string>

class Print {
public:
    // 纯虚函数,要求所有继承的子类必须实现返回名字的逻辑
    virtual std::string getName() = 0;
    void printName() {
        std::cout << getName() << std::endl;
    }
    // 虚析构函数,保证多态场景下资源正常释放
    virtual ~Print() = default;
};

class Human : public Print {
private:
    std::string name;
public:
    void setName(const std::string& newName) {
        name = newName;
    }
    // 重写父类的虚方法,返回当前类存储的name
    std::string getName() override {
        return name;
    }
};

int main() {
    Human h;
    h.setName("Somename");
    h.printName(); // 输出:Somename
    return 0;
}

内容的提问来源于stack exchange,提问作者Hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:30:52