• C++ (P160—)多继承 二义性 虚基类 “向上转型”


    1 多继承中,必须给每个基类指定一种派生类型,如果缺省,相应的基类则取私有派生类型,而不是和前一个基类取相同的派生类型

    2 一个类的保护成员只能被本类的成员函数或者它的派生类成员函数访问

    3 由于c++中不允许对类成员进行初始化,但是在编程时需要用特定的值去初始化派生类的对象,这时需要通过为派生类定义一个带有初始化列表的构造函数来实现。

    class D:public B,private A,public C
    {
       public:
          D(){..................}
          D(int a,int b,int c,int d,int e,int f,int g):A(a,b),a(d,e),b(f),B(c),w(g)
               {..................}
       ..........
       private:
          C c;
          A a;
          B b;//只能这样进行定义类成员变量
          int w;
    };
    
    int main ()
    {
          D  d1;
          D  d2(1,2,3,4,5,6,7);
          return 0;
    }

    4 多继承造成的二义性:若派生类中的成员函数与其基类成员重名的现象,派生类中的成员函数将覆盖所有基类中的同名成员。但是如果只是基类与基类之间的成员重名,

      需要使用作用域运算符“::”来限定:

        

    d.A::a=1;
    d.B::fun();

    注意两点:a. 需要采用派生类的直接基类名来限定,而不是需要访问的成员所在类的类名。

         b. 二义性是在访问控制权限和类型检查之前进行的,因此制定不同的访问控制权限和类型并不能解决二义性问题。

    5 在多继承中的虚基类的作用:以虚基类的形式继承,只建立公共基类的一个副本,这样就不存在二义性

        注意点:c++规定,对于继承过程中的虚基类,它们由最后派生出来的用于声明对象的类来初始化,而对于派生类的基类中对这个虚基类的初始化都被忽略。

    class 派生类名:virtual 派生类型 基类名

    6 “向上转型”

       区别于java,c++有三种情况的向上赋值

     (1)用派生类的对象给积累的对象赋值,赋值的结果是将派生类对象中的所含积累成员的值赋给基类对象中相同的成员

     (2)可以用派生类的对象初始化基类的引用

     (3)可以用派生类对象的地址给积累对象的指针赋值。

       23中方法中的基类的引用和指针只能用来访问派生类对象中从基类继承下来的成员,若想访问派生类中新增成员需要进行强制转换。

    #include <iostream>
    #include <string>
    
    using namespace std;
    class A
    {
    public:
        void funa(){cout<<"调用的A"<<a<<endl;}
        int a;
    };
    class C:public A
    {
    public:
        void func(){cout<<"调用的C"<<c<<endl;}
        int c;
    };
    
    int main()
    {
        
        C c;
        c.a=1;
        c.c=2;
        A &a = c;
        A *aa = &c;
        A aaa = c;
        a.funa();
        ((C&)a).func();
        ((C*)aa)->func();
        ((C)aaa).func();//error
            aaa.func();//error
        return 0;
    }
  • 相关阅读:
    Azure HDInsight 现已在中国正式发布
    避免由于Windows Update自动安装安全补丁导致VM意外重启
    如何修复在Microsoft Azure中“虚拟机防火墙打开,关闭RDP的连接端口”问题
    关于Azure Auto Scale的高级属性配置
    在Azure中使用Load Runner测试TCP最大并发连接数
    Windows Azure案例分析: 选择虚拟机或云服务?
    Windows Server基础架构云参考架构:硬件之上的设计
    浅析基于微软SQL Server 2012 Parallel Data Warehouse的大数据解决方案
    在Windows Azure公有云环境部署企业应用
    如何在后台运行_Linux_命令并且将进程脱离终端
  • 原文地址:https://www.cnblogs.com/dongzhuangdian/p/5253110.html
Copyright © 2020-2023  润新知