C++中对C的扩展学习新增内容———面向对象(继承)

面向对象(继承)

1、继承的作用

(1) 减少冗余代码

使用继承之前:

class IndexPage
{
public:
    void header()
    {
        cout << "显示头部" << endl;
    }

    void footer()
    {
        cout << "显示底部" << endl;
    }

    void body()
    {
        cout << "显示首页的主体内容" << endl;
    }
};


class NewsPage
{
public:
    void header()
    {
        cout << "显示头部" << endl;
    }

    void footer()
    {
        cout << "显示底部" << endl;
    }

    void body()
    {
        cout << "显示新闻的主体内容" << endl;
    }
};

class ProductPage
{
public:
    void header()
    {
        cout << "显示头部" << endl;
    }

    void footer()
    {
        cout << "显示底部" << endl;
    }

    void body()
    {
        cout << "显示产品页面的主体内容" << endl;
    }
};

使用继承之后:

// 公共的函数或者数据
class CommonPage
{
public:
    void header()
    {
        cout << "新式的显示头部" << endl;
    }

    void footer()
    {
        cout << "新式的显示底部" << endl;
    }
};


// IndexPage 子类(派生类)  CommonPage 父类(基类)
// 继承发生时,子类会继承父类的函数、变量
class IndexPage : public CommonPage
{
public:
    void body()
    {
        cout << "显示首页的主体内容" << endl;
    }
};


class NewsPage : public CommonPage
{
public:
    void body()
    {
        cout << "显示新闻的主体内容" << endl;
    }
};

class ProductPage : public CommonPage
{
public:
    void body()
    {
        cout << "显示产品页面的主体内容" << endl;
    }
};


void test01()
{
    // 1. 减少冗余代码,复用代码
    IndexPage index;
    index.header();
    index.body();
    index.footer();

    NewsPage news;
    news.header();
    news.body();
    news.footer();

    ProductPage product;
    product.header();
    product.body();
    product.footer();
}

(2) 扩展类

(3) 修改类

// 2. 可以修改已有类的功能,而不需要修改源代码
class MyFunctions
{
public:
    void function01()
    {
        cout << "功能01" << endl;
    }

    void function02()
    {
        cout << "功能02" << endl;
    }
};

// 如果一个类内部的函数,不满足我们的需要,需要修改该函数的功能。
// 1. 修改源代码  2. 既要修改功能,又不能修改源代码。(开闭原则:扩展功能可以通过增加代码完成,而不是修改源代码)

class NewFunction : public MyFunctions
{
public:
    void function02()
    {
        cout << "新修改的功能02" << endl;
    }
};

void test02()
{
    NewFunction nf;
    nf.function01();
    nf.function02();
}


class NewFunctionEx : public MyFunctions
{
public:
    void function03()
    {
        cout << "功能03" << endl;
    }
};
// // 3. 继承扩展类的功能
void test03()
{
    NewFunctionEx nf;
    nf.function01();
    nf.function02();
    nf.function03();
}

2、继承中的权限

继承中同样会有privatepublicprotected三种权限:

(1)Private 类外不能访问,子类中同样也不能访问。

(2)Public 类外可以访问,子类也可以访问。

(3)Protected类外不可以访问,子类可以访问、

扩展理解:子类能不能访问,比如子类能不能继承该权限的成员?

Pulicprotected权限的成员,子类才可以继承。而类内内部成员的权限决定了,子类能否继承该权限。

 

3、继承方式

 

继承方式决定了被继承下来的成员在子类中是什么权限:

 

(1)、如果是Public继承方式,成员在父类中是什么权限,在子类中仍然是什么权限。

 

(2)、如果是private继承方式,成员在父类中无论是什么权限,在子类中会全部变成私有权限。

 

(3)、如果是protected继承方式,会根据父类中成员的权限来继承,如果成员在父类中是public,在子类变成protected,如果原来就是protected,那么到子类就不改变,依然是protected

 

 

如果没有特殊需求,我们就使用public继承方式。若没有写继承方式,默认为私有继承。

 

 

原文地址:https://www.cnblogs.com/yyslif/p/11757651.html