zoukankan      html  css  js  c++  java
  • C++ part7

    1.C++ 继承和组合

    类的组合和继承一样,是复用的重要方式。
    要优先使用组合而不是继承。 原因:

    1. 组合是黑箱复用,对局部类的内部细节不可见;继承是白箱复用,父类的内部细节可见,破坏封装性。
    2. 继承在编译时刻就已经定义了,在运行时不能改变从父类继承的实现;而组合可以在运行时期通过对象的替换实现。

    2.动态链接、静态链接

    库文件里不是源代码,而是编译后的二进制代码

    动态链接库:需要有头文件,lib文件和dll文件。lib中有调用函数所在的文件模块(dll)和文件中函数位置信息,链接时把这两个信息放进目标程序。
    静态链接库:lib中有函数的实现代码,链接时直接把代码加入可执行文件中。

    动态链接:链接时,只把调用函数所在DLL和文件中函数位置信息放进可执行文件,程序运行的时候再从DLL中找到相应的函数代码,需要DLL文件的支持。
    静态链接:链接时,把函数代码直接放进可执行文件,(当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝),运行时不需要其他库的支持。

    3.子类重写后调用父类函数

    #include<bits/stdc++.h>
    class A{
    public:
        virtual void f(){ cout << "A"; }
    };
    class B : public A{
        void f(){ cout << "B"; }
    };
    int main(){
        A* a = new B();
        a->A::f();	//输出A
        return 0;
    }
    
    

    4.继承方式

    public继承:
    基类继承的成员在派生类中访问权限不变。

    protected继承:
    基类中继承的public访问权限变成protected,其他不变。

    private继承:
    基类继承的所有访问权限变private。

    5.虚继承

    概念:
    虚继承用于解决多继承问题。
    在多继承情况下,不同途径继承来的同一基类,会在子类存在多个拷贝(比如菱形继承问题)。这样会产生两个问题:浪费空间,存在二义性。
    C++提供虚基类,使得继承间接共同使用同一基类时,只保留一份成员。
    子类继承可以继承多个虚基类表指针。

    原理:
    每个虚继承的子类都有一个虚基类表指针,它指向一个虚基类表。虚基类表中记录了虚基类和本类的偏移地址,通过偏移地址就找到了虚基类的成员。
    虚基类依旧占据继承类的存储空间。
    比如:

    class A{
    public:
        int a;
    };
    class B : virtual private A{
    };
    int main(){
        B b;
        cout << sizeof b;	//输出8
        return 0;
    }
    

    输出8,4字节虚基类表指针,4字节int。只是不会有多个虚基类的拷贝而已。

    【注意】当虚基类是带参数的构造函数时,间接继承虚基类的派生类除了要初始化直接继承的父类,还要初始化虚基类。

    class A{
    public:
        A(int a){}
    };
    class B : virtual public A{
    public:
        B(int b):A(b){}
    };
    class C : virtual public A{
    public:
        C(int c):A(c){}
    };
    class D : public B, public C{
    public:
        D(int d):A(d),B(d),C(d){}
    //    D(int d):B(d),C(d){} //error
    };
    
  • 相关阅读:
    【类的继承与派生】学习笔记
    c++类的学习笔记
    c++链表
    实验六--类和对象
    mission3--dp
    POJ2718Smallest Difference(暴力全排列)
    我也不知道该起什么标题....
    noip2014题解
    Windows平台整合SpringBoot+KAFKA__第2部分_代码编写前传
    Windows平台整合SpringBoot+KAFKA_第1部分_环境配置部分
  • 原文地址:https://www.cnblogs.com/KirinSB/p/12799421.html
Copyright © 2011-2022 走看看