定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。用C++
时间: 2024-12-20 17:19:17 浏览: 28
在C++中,当你定义一个基类`Animal`,如下面所示:
```cpp
class Animal {
private:
int age;
public:
Animal(int initialAge) : age(initialAge) {}
void SetAge(int n) { age = n; }
};
```
然后创建一个派生类`Dog`:
```cpp
class Dog : public Animal {
};
```
如果你只在`Dog`的实例上调用`SetAge()`,并且这个实例是通过`Animal* animal = new Dog();`这样的指针来间接访问的,那么`SetAge()`方法会在`Animal`层次面上工作,不会影响到`Dog`特有的行为。这实际上体现了多态的一个基本原理——封装,即派生类可以隐藏它们自己的实现细节。
然而,如果将`age`设为公有成员,就像这样:
```cpp
class Animal {
public:
int age;
// ...
};
```
那么,无论是否为`Dog`实例,都可以直接访问并修改`age`,这可能会导致数据的错误共享或者破坏了封装性。例如,其他地方的代码可以直接调用`animal->age = 5;`,这可能导致`Dog`的年龄属性被意外改变。
尝试运行这样的程序,你会看到如果没有适当的保护措施(比如在派生类中提供自己的`SetAge()`实现),可能会造成意想不到的行为。所以,通常推荐保持成员变量的私有性和提供公共访问器(getter和setter方法)来维护良好的设计模式。
阅读全文