继承的学习

引入

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

1继承的基本语法

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

#include 
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 
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继承方式

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

继承的学习_第2张图片

3继承中的对象模型

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

#include 
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 
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继承同名成员的处理方式

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

  • 访问子类同名成员 直接访问即可
  • 访问父类同名成员 需要加作用域
  • 如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员。得加作用域
    继承的学习_第3张图片

你可能感兴趣的:(c++,学习,c++,开发语言)