0.前言

研究STL库,看到了很多继承,包含,重定义之类的操作。这里补充部分基础知识,以便会看。

1.测试代码

#include<iostream>
using namespace std;
// 测试顺序
class A{
    protected:
    typedef uint16_t uint16;
    public:

    int i;
    A(){
        i = 0;
        cout << "A constructor called, i = " << i << endl;
    }
};

class C{
    public:
    int k;

    C(){
        k = 2;
        cout << "C constructor called, k = " << k << endl;
    }
};
class B:public A{
    public:
    C c;
    int j;
    int i;
    // using A::i; // 继承父类的成员变量
    B(){
        j = 1;
        cout<<A::i<<endl; // 直接访问父类的成员变量
        cout << "B constructor called, j = " << j << endl;
        cout<<c.k<<endl;
    }
};

int main(void){
    B b;
    // B::uint16 a = 0x1234; // 使用父类的typedef
    return 0;
}

2.知识点汇总

p1:实例化类B的执行流程

流程1:先进入B的父类对象A并执行构造函数,打印相关信息

流程2:进入B包含的对象c并执行构造函数,打印相关信息

流程3:进入B自身并执行构造函数,打印相关信息

建议从内存的角度加深理解! 

p2:类中的类型继承

STL中有大量的类型重定义,而且嵌套的次数是在太多了,这让人十分头疼。

从1中的代码可以看到类A定义了一个类型uint16,而且访问权限是protected,所以在其子类B中可以使用该类型

p3:类中访问隐藏变量(函数)

在类B和类A中定义了变量i,所以在实例化B的对象中包含了两份i的内存。如果需要访问父类A中的变量i,可以使用A::i。如果需要访问父类中的成员函数也是类似的。

p4:using的使用

在 effectve c++中有提到using的用法,但是这里的using是可以省略的。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐