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
};

猜你喜欢

转载自www.cnblogs.com/KirinSB/p/12799421.html