欢迎光临
我们一直在努力

C++学习日记 Day9:继承

## 今天学了什么

今天学习C++类与对象-继承,下级别成员除了拥有上一级的共性,还有自己的特性,利用继承可以减少重复代码。

## 继承方式

语法:class 子类(派生类) : 继承方式 父类(基类)

继承方式分为三种:公共继承、保护继承、私有继承。

注:父类中所有非静态成员都会被子类继承,包括private下的成员,private下的成员只是被编译器隐藏,访问不到。

验证:sizeof(Son)打印结果:16。

class Base {
public:
Base()
{
b_age = 10;
b_pro = 20;
b_pri = 30;
}

int b_age;
protected:
int b_pro;
private:
int b_pri;
};

class Son : public Base
{
public:
Son()
{
s_num = 20;
}

int s_num;
};

void test()
{
Son s;
cout << "s_num= " << s.s_num << " Son 继承 Base的 b_age= " << s.b_age << endl;
cout << "sizeof(Son): "<<sizeof(Son) << endl;
}

打开开发人员提示工具(Developer Command Prompt),输入cl /d1 reportSingleClassLayoutSon 继承.cpp ,回车,查看size大小确实是16,父类的三个int都被继承。

## 子类继承父类后的构造析构顺序

子类继承父类后会调用父类的构造函数:

class Base {
public:
Base()
{
cout << "Base 的构造函数" << endl;
}
~Base() {
cout << "Base 的析构函数" << endl;
}
};

class Son : public Base
{
public:
Son()
{
s_num = 20;
cout << "Son 的构造函数" << endl;
}
~Son()
{
cout << "Son 的析构函数" << endl;
}
int s_num;
};

void test()
{
Son s;
s.s_num=10;
cout << "sizeof(Son): "<<sizeof(Son) << endl;

}

打印结果,构造顺序:父类构造-子类构造-子类析构-父类析构,下断点进入调试,逐步调试发现,先进入Base构造函数,后进入Son的构造函数,析构则相反。

## 同名成员处理方式

** 当子类与父类出现同名成员时,如何访问 **

  • 访问子类成员: 直接访问 s.name ;
  • 访问父类成员:加作用域,例 s.Base::name;
  • 当子类出现和父类同名的成员函数时,子类的同名成员会隐藏掉父类所有同名成员函数,想访问需要加作用域,例 s.Base::func();

## 同名静态成员处理方式

  • 通过对象访问与同名非静态成员处理方式相同。
  • 通过类名:
  • 访问子类成员: Son::name ;

    通过子类的类名访问父类静态成员::Son::Base::name;

    ## 多继承

    C++允许一个类继承多个类。

    语法:class 子类:继承方式 父类1,继承方式 父类2…

    注:子类访问不同父类成员,最好加上作用域,防止不同父类同名引发的错误。

    ## 菱形继承(钻石继承)

    菱形继承:两个派生类继承同一个基类,又有一个类同时继承两个派生类,如下图:

    class A {
    public:
    int age;
    int name;
    };

    class B:virtual public Animal {};

    class C :virtual public Animal {};

    class D :public B,public C {
    public:
    int n;
    };

    void test()
    {
    D d;
    d.B::m_age = 10;
    d.name = 100;
    cout << d.name << endl;
    cout << d.B::name << endl;
    cout << d.name << endl;
    }

    类B、类C同时继承类A的成员,类D在使用数据时,需用作用域区分;

    类D继承两份相同数据,资源浪费,利用虚继承可以解决这一问题。

    赞(0)
    未经允许不得转载:171主机测评 » C++学习日记 Day9:继承
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址