zoukankan      html  css  js  c++  java
  • c++继承

    继承
         (1).目的:为了代码的复用、允许在保持原有类特性的基础上进行扩展 、增加功能
         (2).继承关系&访问限定符:
              public、protected、private
         (3).派生类的六个成员函数
              构造函数、析构、拷贝构造、赋值运算符重载、取地址符操作符重载、const修饰的取地址操作符重载
    继承过程中构造函数调用顺序:基类构造函数——>派生类中对象构造函数——>派生类构造函数体
    class A
    {
    public:
         A()
              :a(1)
         {
              cout<<"A()"<<endl;
              cout<<a<<endl;
         }
         void fun()
         {
              cout<<"A-fun()"<<endl;
         }
         ~A()
         {
              cout<<"~A()"<<endl;
         }
    private:
         int a;
    };
    class B:public A
    {
    public:
         B()
         {
              cout<<"B()"<<endl;
         }
         void fun()
         {
              cout<<"B-fun1()"<<endl;
         }
         ~B()
         {
              cout<<"~B()"<<endl;
         }
    private:
         int b;
    };
    int main()
    {
         A a;
         B b;
         return 0;
    }

      (4).赋值兼容规则

              a.子类对象可以赋值给父类对象(切割/切片)
              b.父类对象不能赋值给子类对象
              c.父类的指针/引用可以指向子类对象
              d.子类的指针或者对象不能指向父类对象(可以强制类型转换)
         (5).单继承&多继承&菱形继承
              单继承:一个子类只有一个直接父类的继承关系
              多继承:一个子类有两个或以上的直接父类的继承关系
         菱形继承:存在二义性和数据冗余问题
    class A
    {
    public:
         int a;
    private:
         int a1;
    };
    class B:public A
    {
    public:
         int b;
    private:
         int b1;
    };
    class C:public A
    {
    public:
         int c;
    private:
         int c1;
    };
    class D:public B,public C
    {
    public:
         int d;
    private:
         int d1;
    };
    int main()
    {
         cout<<sizeof(A)<<endl;//8
         cout<<sizeof(B)<<endl;//16
         cout<<sizeof(C)<<endl;//16
         cout<<sizeof(D)<<endl;//40   将a a1保存了两份
         D d;
         d.a=3;                //产生对a访问的二义性  d.C::a  /   d.B::a
         return 0;
    }
    ***虚承继的情况:由于涉及到虚函数表和虚基表,会同时增加一个(多重虚继承下对应多个)vfPtr指针指向虚函数表vfTable和一个vbPtr指针指向虚基表vbTable,这两者所占的空间大小为:8(或8乘以多继承时父类的个数);

     用虚继承解决菱形继承的二义性和数据冗余问题

    安心下来做技术,笑是最大的福气
  • 相关阅读:
    virtualenvwrapper的安装及问题解决
    eclipse添加插件、删除插件 示例: eclipse marketplace
    怎么修改tomcat端口
    Eclipse配置maven环境
    如何查看某个端口被谁占用
    selenium清空默认文字
    Git项目删除文件
    selenium使用chrome抓取自动消失弹框的方法
    Python字符串转为字典方法大全
    接口测试学习
  • 原文地址:https://www.cnblogs.com/JN-PDD/p/6639336.html
Copyright © 2011-2022 走看看