继承的学习

文章介绍了继承在类之间的关系,通过示例展示了如何使用继承减少重复代码,如公共头部和底部的实现。还探讨了继承的方式(公共、保护、私有),对象模型,以及构造和析构函数的执行顺序。同时提到了同名成员的处理,子类会隐藏父类的同名成员,需要使用作用域解析来访问。
摘要由CSDN通过智能技术生成

引入

有些类与类存在特殊关系:
在这里插入图片描述
我们发现:定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这时候我们可以考虑使用继承的技术,减少重复代码。

1继承的基本语法

例如:
我们看到的很多网站,都有公共的头部、底部,只有中间的核心内容不同。
普通实现:

#include <iostream>
using namespace std;
//普通实现页面
class Java
{
public:
    void head()
    {
        cout<<"head"<<endl;
    }
    void foot()
    {
        cout<<"foot"<<endl;
    }
    void content()
    {
        cout<<"java"<<endl;
    }
    
};
class Python
{
public:
    void head()
    {
        cout<<"head"<<endl;
    }
    void foot()
    {
        cout<<"foot"<<endl;
    }
    void content()
    {
        cout<<"Python"<<endl;
    }

};
void test01()
{
    Java ja;
    ja.head();
    ja.content();
    ja.foot();
    Python py;
    py.head();
    py.content();
    py.foot();
}
int main() {
    test01();
    return 0;
}

继承实现:

#include <iostream>
using namespace std;
//继承实现页面
class Basic
{
public:
    void head()
    {
        cout<<"head"<<endl;
    }
    void foot()
    {
        cout<<"foot"<<endl;
    }

};
class Java:public Basic
{
public:
    void content()
    {
        cout<<"Java"<<endl;
    }
};
class Python:public Basic
{
public:

    void content()
    {
        cout<<"Python"<<endl;
    }

};
void test01()
{
    Java ja;
    ja.head();
    ja.content();
    ja.foot();
    Python py;
    py.head();
    py.content();
    py.foot();
}
int main() {
    test01();
    return 0;
}

继承的好处:减少重复代码
语法:class 子类:继承方式 父类
子类也称为派生类,父类也称基类

派生类中成员,包含两部分:
一部分是从基类继承过来的(共性),一类是自己增加的成员(个性)。

2继承方式

  • 公共继承
  • 保护继承
  • 私有继承

在这里插入图片描述

3继承中的对象模型

父类中私有属性被编译器隐藏了,访问不到,但确实被继承了

#include <iostream>
using namespace std;
class Base
{
public:
    int m_A;
protected:
    int m_B;
private:
    int m_C;
};
class Son :public Base
{
public:
    int m_D;
};
void test01()
{
    //16
    //父类中所有成员属性都会被继承下来   父类中私有属性被编译器隐藏了,访问不到,但确实被继承了。
    cout<<sizeof(Son)<<endl;
}
int main ()
{
    test01();
}

4继承中构造和析构顺序

子类继承父类后,当创建子类对象,也会调用父类的构造函数。
问题:父类和子类的构造和析构顺序谁先谁后?
Base构造函数
Son构造函数
Son析构函数
Base析构函数

#include <iostream>
using namespace std;

class Base
{
public:
    Base()
    {
        cout<<"Base构造函数"<<endl;
    }
    ~Base()
    {
        cout<<"Base析构函数"<<endl;
    }
};
class Son :public Base
{
public:
    Son()
    {
        cout<<"Son构造函数"<<endl;
    }
    ~Son()
    {
        cout<<"Son析构函数"<<endl;
    }
};
void test()
{
    Son a;
}
int main (){
    test();
}

5继承同名成员的处理方式

问题:当子类和父类中出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据?

  • 访问子类同名成员 直接访问即可
  • 访问父类同名成员 需要加作用域
  • 如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员。得加作用域
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值