私有继承可以直接在子类的构造函数中给基类的私有成员赋值
时间: 2024-05-03 09:18:19 浏览: 141
私有继承确实可以访问基类的所有成员,但是私有成员仍然不能在子类中直接访问。因此,在子类的构造函数中不能直接给基类的私有成员赋值,需要通过调用基类的公有成员函数来实现。具体实现方法如下:
```cpp
class Base {
private:
int private_data;
public:
Base() {}
void set_private_data(int data) {
private_data = data;
}
};
class Derived : private Base {
public:
Derived() {
set_private_data(10); // 通过调用基类的公有成员函数来给私有成员赋值
}
};
```
在这个例子中,私有继承了基类 `Base`,子类 `Derived` 中不能直接访问 `Base` 的私有成员 `private_data`,但可以通过调用基类的公有成员函数 `set_private_data` 来给私有成员赋值。
相关问题
创建交通工具类(vehicle),类中有私有的数据成员,轮子数量(wheels)和重量(weight);有公有的成员函数,有参构造函数,以及(show)输出交通工具信息的成员函数。 创建子类汽车类(car),公有继承交通工具类,汽车类中新增私有数据成员,载客人数(passenger_num);有公有的成员函数,派生类的有参构造函数,要求采用列表的形式调用基类的构造函数,为继承的父类的数据成员赋值。以及新增的打印输出汽车信息的成员函数,该函数覆盖父类中的输出信息函数(信息包含继承父类的数据成员,以及新增数据成员)。 在main函数中创建一个汽车对象并赋值,并打印输出汽车的轮子数量,重量,载客人数的信息。
好的,我已经理解了您的问题。下面是代码示例:
```cpp
#include <iostream>
using namespace std;
class vehicle {
private:
int wheels;
double weight;
public:
vehicle(int wheels, double weight): wheels(wheels), weight(weight) {}
void show() {
cout << "Vehicle information: " << endl;
cout << "Wheels: " << wheels << endl;
cout << "Weight: " << weight << endl;
}
};
class car : public vehicle {
private:
int passenger_num;
public:
car(int wheels, double weight, int passenger_num): vehicle(wheels, weight), passenger_num(passenger_num) {}
void show() {
cout << "Car information: " << endl;
cout << "Wheels: " << wheels << endl;
cout << "Weight: " << weight << endl;
cout << "Passenger Number: " << passenger_num << endl;
}
};
int main() {
car c(4, 1000.0, 5);
c.show();
return 0;
}
```
在这个示例中,我们定义了一个交通工具类(vehicle)和汽车类(car)。汽车类公有继承交通工具类,新增了一个载客人数(passenger_num)私有数据成员和一个覆盖了父类的show()成员函数。
在main函数中,我们创建了一个汽车对象c,并调用了它的show()函数打印输出汽车信息(包括继承父类的数据成员和新增数据成员)。
1)声明一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(intn)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看。
在面向对象编程中,如果你有一个基类`Animal`,它有一个私有整型成员变量`age`,比如:
```cpp
class Animal {
private:
int age;
public:
// 构造函数和其他公共成员函数
Animal(int initialAge) : age(initialAge) {}
// 其他方法...
};
```
当你尝试在派生类`Dog`中直接通过基类指针或引用调用`SetAge`方法并设置`age`的值时,因为`age`是私有的,所以编译器不会允许这样做,这会导致编译错误。试图访问私有成员通常被视为“非法访问”。
如果将`age`改为公有成员变量,那么就可以像下面这样操作:
```cpp
class Dog : public Animal {
public:
void SetAge(int newAge) { age = newAge; }
// 其他Dog特有的方法...
};
```
在这个例子中,`Dog`可以直接改变其`age`,因为它是公开的。但是,这样的设计可能会破坏封装原则,使得子类能够随意修改父类的内部状态。
你可以尝试在主程序中创建`Dog`实例并测试这个过程:
```cpp
int main() {
Animal* dog = new Dog(5); // 创建Dog对象,隐式调用了Dog的构造函数
// 正确的访问方式
dog->SetAge(6);
// 输出或检查dog的age
std::cout << "Dog's age: " << dog->age << std::endl;
delete dog;
return 0;
}
```
阅读全文