c++那些事儿3.0 继承

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



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

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

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

     ~A() {
         cout << "A的析构函数"<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的构造函数执行"<id = idb;
      }
      ~B() {
          cout << "B的析构函数"<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" <


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

c++那些事儿3.0 继承_第1张图片
结果图.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;
}


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

c++那些事儿3.0 继承_第2张图片
只保留了D类.PNG



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

 虚函数,多态性,这个代码挖了坑,后面在讲,好累啊。

你可能感兴趣的:(c++那些事儿3.0 继承)