C++派生类无法获取基类对象修改的成员值及多对象状态差异化实现
嘿,我来帮你拆解这两个面向对象继承里的常见问题,咱们一步步说清楚~
问题1:基类对象调用setAge后,派生类对象输出ageOfAnimal为0的原因&可行性
首先得明确一个核心的面向对象概念:每个类的实例(对象)都拥有自己独立的成员变量副本。你用Animal基类对象调用setAge(20),只是修改了这个Animal对象自己的ageOfAnimal值;而你的MyDog对象是另一个完全独立的实例,它的ageOfAnimal会使用默认初始化值(比如0),除非你专门给它设置过。
举个模拟你可能实现的代码例子:
#include <iostream> using namespace std; class Animal { protected: int ageOfAnimal = 0; public: void setAge(int age) { ageOfAnimal = age; } }; class MyDog : public Animal { public: void getInfo() { cout << ageOfAnimal << endl; } }; int main() { Animal a; a.setAge(20); // 仅修改a对象的ageOfAnimal MyDog d; d.getInfo(); // 输出d对象自己的默认值0 return 0; }
如果想让派生类对象拿到基类对象的20,有几种可行方式:
- 直接给派生类对象调用
setAge(20),而不是基类对象 - 如果需要让基类的状态被所有派生类共享,可以把
ageOfAnimal改成静态成员变量(但注意这样所有Animal及其派生类的实例都会共用同一个值,可能不符合你第二个问题的需求) - 通过基类的get方法获取值后赋值给派生类对象,比如
d.setAge(a.getAge());(需要基类新增getAge方法)
问题2:让不同派生类对象(MyDog/MyCat)的ageOfAnimal状态独立(输出20和21)
你现在所有对象输出都是20,大概率是因为要么给所有对象都调用了setAge(20),要么误用了静态成员导致状态共享。根据需求,分两种场景实现:
场景1:每个派生类的所有实例共享各自的age(比如所有MyDog都是20,所有MyCat都是21)
给每个派生类定义专属的静态成员变量,配合基类的虚方法让派生类自己维护状态:
#include <iostream> using namespace std; class Animal { public: virtual int getAge() const = 0; // 纯虚方法,强制派生类实现 virtual void setAge(int age) = 0; }; class MyDog : public Animal { private: static int dogAge; // 所有MyDog实例共享的静态age public: int getAge() const override { return dogAge; } void setAge(int age) override { dogAge = age; } void getInfo() { cout << getAge() << endl; } }; int MyDog::dogAge = 0; // 静态成员必须类外初始化 class MyCat : public Animal { private: static int catAge; public: int getAge() const override { return catAge; } void setAge(int age) override { catAge = age; } void getInfo() { cout << getAge() << endl; } }; int MyCat::catAge = 0; int main() { MyDog d; d.setAge(20); MyCat c; c.setAge(21); MyDog d2; d2.getInfo(); // 输出20,和d共享状态 MyCat c2; c2.getInfo(); // 输出21,和c共享状态 return 0; }
场景2:每个派生类实例有自己独立的age(比如MyDog实例d1=20、d2=22;MyCat实例c1=21、c2=23)
这种更简单,只要让派生类继承基类的非静态成员,给每个对象单独设置即可:
#include <iostream> using namespace std; class Animal { protected: int ageOfAnimal = 0; public: void setAge(int age) { ageOfAnimal = age; } int getAge() const { return ageOfAnimal; } }; class MyDog : public Animal { public: void getInfo() { cout << getAge() << endl; } }; class MyCat : public Animal { public: void getInfo() { cout << getAge() << endl; } }; int main() { MyDog d; d.setAge(20); MyCat c; c.setAge(21); d.getInfo(); // 输出20 c.getInfo(); // 输出21 return 0; }
核心逻辑是:每个对象自己持有ageOfAnimal的副本,给不同对象设置不同值,输出自然会不同。你之前全输出20,应该是不小心给MyCat对象也设置了20,或者误用了静态成员导致状态共享。
内容的提问来源于stack exchange,提问作者Eduard Fedoruk
相关产品推荐
相关产品推荐

