• C++语法小记---多重继承


    多重继承
    • 工程中不建议使用多继承,因为多继承带来的问题比带来的便利多,已被放弃

    • 问题一:多重继承的对象,向上获取指针时,有不同的地址 ----无法解决

    • 问题二:菱形继承问题,导致成员冗余 ----虚继承(各种编译器的实现方式不一致,不具备抑制性)

    • 多重继承产生多个虚函数表,建议使用dynmaic_cast进行类型转换

    • 工程中的用法:单继承 + 多接口

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 class Base
     7 {
     8     int mi;
     9 public:
    10     Base(int i) : mi(i)
    11     {
    12     }
    13     
    14     int getI()
    15     {
    16         return mi;
    17     }
    18     
    19     bool Equal(Base *p)
    20     {
    21         return (p == this);
    22     }
    23 };
    24 
    25 class Interface1
    26 {
    27 public:
    28     virtual void show1() = 0;
    29 };
    30 
    31 class Interface2
    32 {
    33 public:
    34     virtual void show2() = 0;
    35 };
    36 
    37 class Derived : public Base, public Interface1, public Interface2
    38 {
    39     int mj;
    40 public:
    41     Derived(int i, int j) : Base(i), mj(j)
    42     {
    43     }
    44     
    45     int getJ()
    46     {
    47         return mj;
    48     }
    49     
    50     void show1()
    51     {
    52         cout<<"show1()"<<endl;
    53     }
    54     
    55     void show2()
    56     {
    57         cout<<"show2()"<<endl;
    58     }
    59     
    60 };
    61 
    62 int main()
    63 {   
    64     Derived d(1, 2);
    65     cout<<"d.getI() = "<< d.getI() <<endl;
    66     cout<<"d.getJ() = "<< d.getJ() <<endl;
    67 
    68     Interface1 *p1 = &d;
    69     Interface2 *p2 = &d;
    70     cout<<"p1 = "<<p1<<endl; 
    71     cout<<"p2 = "<<p2<<endl;  //同一个对象获得不同地址
    72     
    73     //基类中定义equal函数,利用dynamic_cast转型,判断是否是同一个对象
    74     if( d.Equal(dynamic_cast<Base*>(p1)) ) 
    75     {
    76         cout<<"p1 == &d"<<endl;  //输出p1 == &d
    77     }
    78     
    79     if( d.Equal(dynamic_cast<Base*>(p2)) )
    80     {
    81         cout<<"p2 == &d"<<endl; //输出p2 == &d
    82     }
    83     
    84     return 0;
    85 }
  • 相关阅读:
    pycharm突然变成了一个tab变成两个空格,查询无果
    79--JT项目17(Dubbo框架入门)
    79--JT项目17(SOA/RPC思想/zookeeper集群搭建)
    Java instanceof Operator
    12.21.4命名为Windows
    12.20.1汇总功能说明
    第24章分区
    Laravel 中间件的使用
    Laravel session的使用
    Laravel 数据分页
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11313026.html
Copyright © 2020-2023  润新知