C++--第15课 - 惊艳的继承

Posted free-1122

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++--第15课 - 惊艳的继承相关的知识,希望对你有一定的参考价值。

第15课 - 惊艳的继承

1. 继承的概念

面向对象中的继承指类之间的父子关系,子类拥有父类的所有成员变量和成员函数。子类就是一种特殊的父类,子类对象可以当作父类对象使用,子类可以拥有父类没有的方法和属性。

如下面的程序:

#include <cstdlib>

#include <iostream>

using namespace std;

class Parent

private:

    int a;

public:

    Parent()

   

        a = 1000;

   

    void print()

   

        cout<<"a = "<<a<<endl;

   

;

class Child : Parent  //chlid继承的a和print函数变成了私有的。

;

int main(int argc, char *argv[])

    Parent parent;

    Child child;

    parent.print();

    //child.print();

    cout << "Press the enter key to continue ...";

    cin.get();

    return EXIT_SUCCESS;

 

2. 深入了解继承

继承时的访问级别设定会影响到成员的访问级别。

class Child : Parent

;

等价于:

class Child :private Parent

;

注意:

C++中class的继承默认为private继承。

private继承的子类拥有父类的所有成员。

private继承使得父类的所有成员在子类中变为private成员。

l  public继承

父类成员在子类中保持原有访问级别。

l  private继承

父类成员在子类中变为private成员。

为子类添加新的成员:

#include <cstdlib>

#include <iostream>

using namespace std;

class Parent

private:

    int a;

public:

    Parent()

   

        a = 1000;

   

    void print()

   

        cout<<"a = "<<a<<endl;

   

;

class Child : public Parent

private:

    int b;

public:

    void set(int a, int b)

   

        this->a = a;

        this->b = b;

   

;

int main(int argc, char *argv[])

    Parent parent;

    Child child;

    parent.print();

    child.print();  

    cout << "Press the enter key to continue ...";

    cin.get();

    return EXIT_SUCCESS;

以上这个程序在运行的时候会出错,显示int a是private的。我们于是开始思考下面的问题:

类成员的访问级别只有public和private是否足够?

 

3. protected关键字

protected成员可以在子类中被访问,但不能在外界被访问。

protected成员的访问权限介于public和private之间。

#include <cstdlib>

#include <iostream>

using namespace std;

class Parent

protected:

    int a;

public:

    Parent()

   

        a = 1000;

     

    void print()

   

        cout<<"a = "<<a<<endl;

   

;

class Child : public Parent

protected:

    int b;

public:

    void set(int a, int b)

   

        this->a = a;

        this->b = b;

   

;

int main(int argc, char *argv[])

    Parent parent;

    Child child;

    parent.print();

    child.print();  

    cout << "Press the enter key to continue ...";

    cin.get();

    return EXIT_SUCCESS;

运行结果:

a = 1000

a = 1000

 

4. 继承与访问级别

需要被外界访问的成员直接设置为public。

只能在当前类中访问的成员设置为private。

只能在当前类和子类中访问的成员设置为protected。

private成员在子类中依然存在,但是却无法访问到。

 

公式:继承成员对外的访问属性= Max 继承方式, 父类成员访问级别

 

5. 继承与访问级别深度实践

 

#include <cstdlib>

#include <iostream>

using namespace std;

class A

private:

    int a;

protected:

    int b;

public:

    int c;   

    A()

   

        a = 0;

        b = 0;

        c = 0;

   

    void set(int a, int b, int c)

   

        this->a = a;

        this->b = b;

        this->c = c;

   

;

class B : public A

public:

    void print()

   

        cout<<"a = "<<a;  //error ,private

        cout<<"b = "<<b;  //right

        cout<<"c = "<<endl;  // right

   

;

class C : protected A

public:

    void print()

   

        cout<<"a = "<<a;  // error ,private

        cout<<"b = "<<b;  //

        cout<<"c = "<<endl;  //

   

;

class D : private A

public:

    void print()

   

        cout<<"a = "<<a; // error

        cout<<"b = "<<b;

        cout<<"c = "<<endl;

   

;

int main(int argc, char *argv[])

    A aa;

    B bb;

    C cc;

    D dd; 

    aa.c = 100;

    bb.c = 100;

    cc.c = 100;  //reeor

    dd.c = 100;  //error

    aa.set(1, 2, 3);

    bb.set(10, 20, 30);

    cc.set(40, 50, 60);  //error

    dd.set(70, 80, 90); //error

    bb.print();

    cc.print();

    dd.print();

    cout << "Press the enter key to continue ...";

    cin.get();

    return EXIT_SUCCESS;

小结:

继承是一种类之间的关系,子类是一种特殊的父类。

子类通过继承可以得到父类的所有成员。

private成员可以被子类继承但不能被子类访问。

protected成员只能在当前类和子类中被访问。

不同的继承方式可能改变继承成员的访问属性。

 

以上是关于C++--第15课 - 惊艳的继承的主要内容,如果未能解决你的问题,请参考以下文章

第53课 被遗弃的多重继承(上)

C++--第16课 - 继承中的构造与析构

第45课 继承中的访问级别

第54课 被遗弃的多重继承(下)

第 20 课 go如何实现继承的

第51课 继承对象模型分析——多态的本质分析