c++定义一个基类Animal,有私有整形成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?改为保护类型呢?改变继承方式呢?
时间: 2025-06-09 15:03:05 浏览: 34
在C++中,当你定义一个基类`Animal`,其中包含一个私有整型成员变量`age`,然后尝试通过派生类`Dog`来修改这个变量时,可能会遇到访问权限的问题。因为`age`是私有的,所以在`Dog`类中直接赋值会给访问带来困难,除非显式地提供`Animal`类的公共方法进行访问。
例如:
```cpp
class Animal {
private:
int age;
public:
Animal(int a) : age(a) {}
void SetAge(int n) { age = n; } // 这里可以修改age,但通常不合适,因为它破坏了封装原则
};
class Dog : public Animal {
public:
void modifyAge() {
age = 5; // 直接赋值会报错,因为age是private
}
};
```
如果你将`age`改为公有成员变量,则`Dog`可以直接修改它,没有访问限制,这可能会影响`Animal`类的封装性:
```cpp
class Animal {
public:
int age;
Animal(int a) : age(a) {}
void SetAge(int n) { age = n; }
};
class Dog : public Animal {
public:
void modifyAge() {
age = 5; // 现在可以直接修改age
}
};
```
如果改为保护类型(`protected`),派生类`Dog`仍然可以访问,但外部无法直接修改,增强了安全性:
```cpp
class Animal {
protected:
int age;
public:
Animal(int a) : age(a) {}
void SetAge(int n) { age = n; }
};
class Dog : public Animal {
public:
void modifyAge() {
age = 5; // 可以在派生类内部修改age
}
};
```
改变继承方式,比如用组合(Composition)而不是继承(Inheritance),则可以在`Dog`类中拥有自己的`age`变量,而不是直接修改`Animal`的`age`,这样能更好地维护各自的职责:
```cpp
class Animal {
private:
int animalAge;
public:
Animal(int a) : animalAge(a) {}
void SetAge(int n) { animalAge = n; }
};
class Dog {
private:
int dogAge;
public:
Dog(int d) : dogAge(d) {} // 使用自己的age
void setDogAge(int n) { dogAge = n; }
};
```
总结来说,关于`age`的访问控制问题,取决于你如何设计类的接口和责任分配。
阅读全文
相关推荐


















