我有2节课。基础 - Animal
和派生MyDog
。我想从ageOfAnimal
方法更改setAge
,然后在派生类中显示更改的值 - MyDog
代码:
#include <iostream>
#include <string>
using namespace std;
class Animal
{
public:
int ageOfAnimal = 0;
int setAge(int age) {
ageOfAnimal = age;
return ageOfAnimal;
}
};
class MyDog: public Animal
{
public:
void getInfo() {
cout << ageOfAnimal;
}
};
int main()
{
Animal *animal = new Animal;
animal->setAge(20);
MyDog myDog;
myDog.getInfo();
return 0;
}
输出:0
为什么我得不到20?这甚至可以吗?
更新
谢谢你的答案,但我想要的是从不同的对象
class Animal
{
public:
int ageOfAnimal = 0;
int setAge(int age) {
ageOfAnimal += age;
return ageOfAnimal;
}
}
class MyCat: public Animal
{
public:
void getInfo() {
cout << ageOfAnimal;
}
}
class MyDog: public Animal
{
public:
void getInfo() {
cout << endl << ageOfAnimal;
}
}
int main() {
myDog dog;
dog.getInfo();
MyCat cat;
cat.getInfo();
}
输出: 20 20
但我想看到的是什么20 21.如何做到这一点?
答案 0 :(得分:2)
在使用代码中有两个不同的对象:Animal * animal
和MyDog myDog
。两个对象都有自己的ageOfAnimal
实例:在一个对象中更改它不会修改第二个对象(这是预期的行为)。
1。由于MyDog
源自Animal
,所以可以简单地说:
MyDog myDog;
myDog.setAge(20);
myDog.getInfo();
2。如果您希望ageOfAnimal
为Animal
的所有实例设为全局,则应将其设为。
<强>更新强>
要反映更新的问题:可以将getInfo
放入Animal
课程。然后可以在构造函数中指定猫和狗的默认年龄。
更好的方法是在Animal
ctor中指定年龄,并对MyDog
和MyAnimal
ctors使用static member。
class Animal
{
public:
int ageOfAnimal = 0;
int setAge(int age)
{
ageOfAnimal += age;
return ageOfAnimal;
}
void getInfo()
{
cout << endl << ageOfAnimal;
}
};
class MyCat : public Animal
{
public:
MyCat()
{
setAge(40);
}
};
class MyDog : public Animal
{
public:
MyDog()
{
setAge(20);
}
};
int main()
{
MyDog dog;
dog.getInfo();
MyCat cat;
cat.getInfo();
}
输出:
20
40
或者,如果您希望在所有对象之间共享年龄,请按照之前的建议将其设为静态成员:
class Animal
{
public:
static int ageOfAnimal;
int setAge(int age)
{
ageOfAnimal += age;
return ageOfAnimal;
}
void getInfo()
{
cout << ageOfAnimal;
}
};
// Initialize age
int Animal::ageOfAnimal = 0;