c++那些事儿3.0 继承

    一般形式   
     class class_name:继承方式 基类名{ code   }
         继承方式有三种: public ,protected,private.   //java好像都是public继承。
     单继承
     多继承,多继承会很复杂,所以java,c sharp都采用interface。
  类函数:
     构造函数
           先执行父类的构造函数,在执行子类的构造函数。
           一般形式  派生类的构造函数(参数列表):基类构造函数名(参数列表}{ code}
     析构函数
           先构造的后析构,后构造的先析构。
     虚函数。
     避免二义性。但是最后的派生类不仅负责对直接基类初始化,还要对虚基类初始化。



看code是最有用的,细节情况已经注释说明。

#include<iostream>
#include<string>
using namespace std;
     // 类A
class A {
  protected:
    string name;
    int id;
    double da;
private:
    double pa; //这个数据继承后不能被访问
 public:
     A(string name, int id) {
         cout << "A的构造函数执行"<<endl;
         this->name = name;   //this指针
         this->id = id;
         this->da = da;
     }

     void setDa(double d) {
         da = d;
     }

     ~A() {
         cout << "A的析构函数"<<endl;
     }

    void setId(int id) {
//id是私有数据成员,不能被继承,类外不能访问,通过函数才能
        this->id = id;
     }

     void print() {
         cout << "string=" << name << "  " << "id=" << id<< endl;
     }

};
// 注意 C++中类的结尾是有;的,和java不同,我vs,ide编辑没有在意。

//如果不写关键字,默认为private。
class B :virtual public A {
    //B类public继承A类,但是私有数据成员不能访问。
  protected:
    int id;  //A类的id成员被覆盖了。

  public:
  /*
  父类构造函数的初始化通过子类构造函数初始化列表实现,
  */
    
      B(string na,int ida,int idb):A(na,ida){
          cout << "B的构造函数执行"<<endl;
          this->id = idb;
      }
      ~B() {
          cout << "B的析构函数"<<endl;
      }

      void  print() {
          /*
          基类同名的数据成员在派生类被覆盖,成为不可见。
          */
          cout << "A类被继承的ID:" << A::id << endl;
          cout <<"name:B"<< name<<" "<<"id:"<<id<<endl; //name是继承A的。
      }

};

class C:virtual public A{

    //B类public继承A类,但是私有数据成员不能访问。
protected:
    int id; 

public:
    /*
    父类构造函数的初始化通过子类构造函数初始化列表实现,
    */
    C(string na,int ida,int idc) :A(na,ida) {
        cout << "C的构造函数执行" << endl;
        this->id = idc;
    }
    ~C() {
        cout << "C的析构函数" << endl;
    }

    void  print() {
        cout << "name:C" << name << " " << "id:" << id << endl;; //name是继承A的。
        
    }
};

//D类继承B,C, 因为B,C都继承A,所以D类有2份A,这样就会出现二义性问题。
class D :public B,public C {
 public:
     void showId() {
        /* cout << "id::" << id << endl;
           如果这样,就会产生二义性,D公有继承了B,C protedted的id,
           这里不知道访问哪一个。 但是可以通过域运算符指定A,B,C继承来的id。
        */
         cout << "id::A" <<A::id << endl;
                  //通过域运算符指定id。
     }

     /*
      D继承了,B,C。B,C继承了A,即继承了double da;
      怎么访问它了。
          cout<<da;
          cout<<A::da; 都不行,无法指出是继承B的,还是C的。
           所以就要虚基类了。
     */
     void showDa() {

         cout << "B::da" << B::da << endl;
     }
     /*
     在以前派生类只对其直接基类初始化,在由其直接子类对间接子类初始化
     现在由于虚基类在派生类只有一份拷贝,所以这份数据必须由派生类给出。
     因为类B,类C可能给出不同的构造函数,这样对虚基类初始化会产生矛盾。
     */

     D(string na, int ida, int idc) :C(na, ida, idc),
         B(na, ida, idc), A(na, ida)
     {
         cout << "D的构造函数执行" << endl;
     }
     ~D() {
         cout << "D的析构函数" << endl;
     }

 
};

int main() {


    A a("name_A", 111);
    a.print();
    cout << "-----------------------------" << endl;
    //先执行父类的构造函数,在执行基类的构造函数
    B b("name_B",111, 222);
    //这里是B的id,因为private属性在子类不能访问。
    b.print();
    cout << "-----------------------------" << endl;
    C c("name_C", 111, 333);
    //这里是B的id,因为private属性在子类不能访问。
    c.print();
    cout << "-----------------------------" << endl;


    D d("name_D", 111, 444);

    // id的二义性 可以通过 ::域运算符指定,解决。
       d.showId();

     // 准备验证double da; 产生二义性的情况,这个就只能通过虚基类确定。
      //   setDa() 是会产生二义性的函数,但是A是虚基类。
       d.setDa(3.1415926);
       d.showDa();
       cout << "-----------------------------" << endl;

    
     system("pause");  //vs要看析构函数要去掉这一句。
    return 0;
}


结果如下,可以对照代码分析

结果图.PNG

这里main函数的代码如下:

int main() {
       D d("name_D", 111, 444);
    // id的二义性 可以通过 ::域运算符指定,解决。
       d.showId();

     // 准备验证double da; 产生二义性的情况,这个就只能通过虚基类确定。
      //   setDa() 是会产生二义性的函数,但是A是虚基类。
       d.setDa(3.1415926);
       d.showDa();
       cout << "-----------------------------" << endl;

                                     /*  vs选择开始执行但不调试 */
    // system("pause");  //vs要看析构函数要去掉这一句。
    return 0;
}


构造函数和析构函数执行顺序验证

只保留了D类.PNG



东西好多啊,c++ 讲个语法就不少东西了

 虚函数,多态性,这个代码挖了坑,后面在讲,好累啊。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • 1.面向对象的程序设计思想是什么? 答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。 2.什么是类?...
    少帅yangjie阅读 4,995评论 0 14
  • 一、 C/C++程序基础 面试例题1——分析代码写输出(一般赋值语句的概念和方法)。 面试例题2—...
    LuckTime阅读 1,972评论 2 42
  • 姓名:程英鑫 学号:16020140082 学院:电子工程学院 转载自:头条号 有删减 【嵌牛导读】:每当浏...
    落意秋浓阅读 388评论 0 0
  • 不减肥的结果,老板,来两碗,管饱就行。。。吃货在下那么大的雷阵雨,依然执着前往可以一家,比较温馨的米线馆,小城在午...
    杨二灿阅读 214评论 0 0
  • 2017 11 15 晴 星期三 儿子晚上回来,自己进房间写作业,我抱着二宝,时不时的偷偷的瞄一眼,看看是不...
    99d29bce557c阅读 137评论 0 0