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
相关产品推荐
相关产品推荐

