当前位置:   article > 正文

c++的继承方式和派生对象的初始化_派生的对象初始化要注意什么

派生的对象初始化要注意什么

因为访问控制的权限有3中,public,protected,private,它们分别是不同的访问等级,
同理类的继承也有这3种方式

公有(public)继承,基类成员保持自己原有的访问方式不变,public 还是public ,protected还是protected,private还是private。
保护(protected)继承,基类的public成员和protected成员在派生类中都为protected,private还是private。
私有(private)继承,基类的所有成员在派生类中都为private成员。
继承时注意的事项
1区分好类的内部访问权限和外部访问权限
一个类所有的数据函数于成员函数对类的内部成员可见(开放),访问权限控制数据成员和成员函数是否提供类外访问

  1. #include <iostream>
  2. using namespace std;
  3. class Base{
  4.     
  5.     private:
  6.     int a,b;       //定义基类,设置两个整形的成员变量,把访问权限设置为private
  7.     
  8.     public:
  9.     Base(){
  10.         a= 1,b=2;
  11.     }
  12.     void showab(){
  13.         cout<<a<<b<<endl;
  14.     }
  15.     
  16. };
  17. class B1:public Base{
  18.     private:
  19.     char i,j;
  20.     
  21.     public:
  22.     B1(){
  23.         i = '2',j = '3';
  24.         
  25.     }
  26.     void showabij(){
  27.         cout<<a<<b<<i<<j;   //在子类的方法中去访问基类的private成员变量a,b;
  28.     }                        //编译时报错,提示a,b,是私有的,无法被我们的子类方法去访问
  29.     
  30. };
  31. int main(){
  32.     B1 o;
  33.     o.showabij();
  34. }


这就是访问控制的效果,为了实现输出a,b我们可以稍加修改

  1. void showabij(){
  2.         Base::showab();  //调用基类的方法
  3.         cout<<i<<j;
  4.     }



2.派生类进一步限制了对所继承基类的基类成员的访问
如果继承方式是private的,则不论基类中的成员是公有的还是保护的权限,被派生类继承后就全是私有的不再提供任何的类外访问,下面举个例子

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Base {
  5.  public:
  6.     string name = "默认为张三";
  7.     int age = 0;
  8.     char sex = 'm';
  9.     Base() {};
  10.     Base(int age, string name, char sex) {
  11.         this->name = name;
  12.         this->age = age;
  13.         this->sex = sex;
  14.     }
  15.     string getName() {
  16.         return name;
  17.     }
  18.     void showName() {
  19.         cout << name;
  20.     }
  21.     void showMESS() {
  22.         cout << name << age << sex;
  23.     }
  24. };
  25. class B1 :private Base {     //在B1的private继承后,所有继承的属性变成私有的
  26. private:
  27.     int num = 0;
  28.     double bod_length = 0;
  29. public:
  30.     B1() {};
  31.     B1(int n, double b){
  32.         num = n; bod_length = b;
  33.     }
  34.     void showMESSAGE() {
  35.         cout << num<< bod_length;
  36.         cout << age << name << sex;
  37.     
  38.     }
  39. };
  40. class B2 :private B1 {       //用B2来继承B1看一下效果
  41. private:
  42.     double weighet;
  43. public:
  44.     B2(double weighet) { this->weighet = weighet; };
  45.     void show_MESS() {
  46.         cout << weighet;
  47.         cout << num << bod_length;     //程序报错,提示无法访问num,等变量
  48.         cout << age << name << sex;
  49.     }
  50. };
  51. int main() {
  52.  B1 bn =  B1(123, 18.7);  //调用构造函数初始化
  53.     B2 bn1 = B2(99.45);
  54.     bn1.show_MESS();   //无法访问private的成员变量
  55.     int i; cin >> i;
  56. }


如果要运行的话,把B1,B2的继承方式改为protected或public即可

在这里插入图片描述
3基类保护(protected)成员是实现继承下信息隐藏的最好方法
利用protected的方式继承能够让类的成员在本类和子类之间相互可见能够在继承中共享(除了private成员)

  1. #include <iostream>   //将继承方式改为protected后
  2. #include <string>
  3. using namespace std;
  4. class Base {
  5.  public:
  6.     string name = "Oh year sir♂";
  7.     int age = 0;
  8.     char sex = 'm';
  9.     Base() {};
  10.     Base(int age, string name, char sex) {
  11.         this->name = name;
  12.         this->age = age;
  13.         this->sex = sex;
  14.     }
  15.     string getName() {
  16.         return name;
  17.     }
  18.     void showName() {
  19.         cout << name;
  20.     }
  21.     void showMESS() {
  22.         cout << name << age << sex;
  23.     }
  24. };
  25. class B1 :protected Base {
  26. protected:
  27.     int num = 0;
  28.     double bod_length = 0;
  29. public:
  30.     B1() {};
  31.     B1(int n, double b){
  32.         num = n; bod_length = b;
  33.     }
  34.     void showMESSAGE() {
  35.         cout << num<< bod_length;
  36.         cout << age << name << sex;
  37.     
  38.     }
  39. };
  40. class B2 :protected B1 {
  41. private:
  42.     double weighet;
  43. public:
  44.     B2(double weighet) { this->weighet = weighet; };
  45.     void show_MESS() {
  46.         cout << weighet;
  47.         cout << num << bod_length;
  48.         cout << age << name << sex;
  49.     }
  50. };
  51. int main() {
  52.     B1 bn =  B1(123, 18.7);
  53.     bn.showMESSAGE();
  54.     B2 bn1 = B2(99.45);
  55.     int i; cin >> i;
  56. }


派生类对象的初始化
定义了一个派生类之后,它将继承基类中除了构造函数和析构函数的全部成员
因此当生成派生类的一个对象时,该对象包含全部的数据成员。
派生类的初始化是通过调用派生类的构造函数来实现的
格式1:构造函数名(参数表):基类构造函数名(参数表);
格式2:构造函数名(参数表):基类构造函数名(参数表),对象成员名(参数表);
下面给出例子

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Car {                  //抽象类
  5. public:
  6.     string carname;           //车名
  7.     string product_place;
  8.     unsigned  hour_speed;
  9.     unsigned  roll;
  10.     unsigned   price;
  11.     unsigned   addspeed0_100;
  12.     Car(string carname, string product_place, unsigned hour_speed, unsigned roll, unsigned price, unsigned addspeed0_100) {
  13.         this->carname = carname;
  14.         this->product_place = product_place;
  15.         this->hour_speed = hour_speed;
  16.         this->roll = roll;
  17.         this->price = price;
  18.         this->addspeed0_100 = addspeed0_100;
  19.         cout << "进入构造方法" << endl;
  20.     };
  21.     Car(string carname) {        //重载构造方法
  22.         this->carname = carname;
  23.     }
  24.     ~Car();
  25. public:
  26.     virtual void run() {
  27.     }   //虚方法
  28. };
  29. Car::~Car() {
  30.     cout << "进入析构器" << endl;
  31. }
  32. class Ferrari :public Car {     //定义车的子类,法拉利继承父类车
  33. public:
  34.     Ferrari() :Car("Ferrari") {     //派生类的构造函数
  35.         cout << "hhh" << endl;
  36.     }
  37.     void run() {
  38.         cout << "从写父类的方法" << endl;
  39.         cout << "法拉利正在跑.............唰!!!" << endl;
  40.     }
  41. };
  42. class toyotA : public Car {  //定义TOYOTA,继承父类
  43. public:
  44.     toyotA(string carname, string product_place, unsigned hour_speed, unsigned roll, unsigned price, unsigned addspeed0_100) :Car(carname, product_place, hour_speed, roll, price, addspeed0_100) {
  45.         cout << "我重载了父类的构造方法" << endl;   //定义派生类的构造函数
  46.     }
  47.     void run() {
  48.         cout << "重写父类方法" << endl;
  49.         cout << "我是一辆小丰田" << endl;
  50.     }
  51.     void downfromMontains() {
  52.         cout << carname << endl;
  53.         cout << "注意AE86下山了!!!" << endl;
  54.     }
  55. };
  56. int main() {
  57.     Ferrari p458;
  58.     toyotA AE86 = toyotA("AE86", "Japen", 150, 4, 200000, 9);
  59.     AE86.downfromMontains();
  60.     char i;
  61.     cin >> i;
  62. }


在这里插入图片描述
现在要到12点了先溜为敬,告辞。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/209119
推荐阅读
相关标签
  

闽ICP备14008679号