继承(一)

继承是一个具化的过程,父类的范围更大,子类的范围更小,父类时一个更广泛的概念,子类是一个更具体的概念。

注意:在继承时有三种继承方式,分别是public ,protected ,private.

public 的继承方式,成员在父类中的访问权限是什么样的,在子类中还是什么样的,

 1 class Base
 2 {
 3 public:
 4     int x;//在Base中是public,在Derived类中还是public
 5 protected:
 6     int y;//在Base中是protected,在Derived类中还是protected
 7 private:
 8     int z;//在Base中是private,在Derived类中还是private
 9 };
10 
11 class Derived :public Base
12 {
13 
14 
15 };

protected 的继承,在基类中的public和protected ,继承到子类中都protected,   private的成员继承到子类中还是private

 1  1 class Base
 2  2 {
 3  3 public:
 4  4     int x;//在Base中是public,在Derived类中还是protected
 5  5 protected:
 6  6     int y;//在Base中是protected,在Derived类中还是protected
 7  7 private:
 8  8     int z;//在Base中是private,在Derived类中还是private
 9  9 };
10 10 
11 11 class Derived :protected Base
12 12 {
13 13 
14 14 
15 15 };

private继承,无论基类成员的访问权限是什么,在派生类中都是private

 1 class Base
 2 {
 3 public:
 4     int x;//在Base中是public,在Derived类中还是private
 5 protected:
 6     int y;//在Base中是protected,在Derived类中还是private
 7 private:
 8     int z;//在Base中是private,在Derived类中还是private
 9 };
10 
11 class Derived :public Base
12 {
13 
14 
15 };

类接口:类中的共有的(public)成员函数称为接口

公有继承中,基类的public成员函数被继承到派生类,还是public的,换句话说,基类的接口被继承到了派生类,成为了派生类的接口,故公有继承也称作接口继承。

在非公有继承中,基类的接口被继承到派生类,但是在派生类中的访问权限是,protected,或是private的,不再是类的接口,派生类只是想重用基类的实现而已,故非公有继承被称作实现继承。

在继承中,会出现隐藏,就是子类中的函数,会对基类中的同名函数进行隐藏,但是要注意,子类中对基类的同名函数隐藏。当基类中的函数不是虚函数时,可以通过在子类中对同名的函数修改参数,或者返回值来隐藏基类中的函数,但是基类中的函数是虚函数,就不能仅仅修改返回值了,还要修改参数。

#include<iostream>
#include<string>
using namespace std;

class Base
{
public:
    int m_X;
    void print()const
    {
        cout << "Base::m_X:" << m_X << endl;
    }
};

class Derived :public Base
{
public:
    int m_X;
    void print(int)const
    {
        cout << "Derived::m_X:" << m_X << endl;
    }
    int print(int ,int)
    {

    }
    int print()const//这里要特别注意,基类中的返回值是void,而这个子类中的函数只改变了基类的返回值,因为基类中的void print()const;函数不是虚函数,所以不会报错,如果基类中的void print()const函数是虚函数,这里就会报错。当然如果不想程序报错,就把参数也修改了
    {
    }
};
int main()
{
    Derived d;
    int a=0;
    d.m_X = 10;
    //d.print();  //Error:这样会出现错误,Derived::print()函数不接受0个参数
                 //说明,Derived类中的print(int)函数把积累中的基类中的print()给隐藏了。
    d.print(a);
    d.Base::m_X = 100;//因为子类中含有和基类成同名的成员变量和成员函数,故把基类中的成员变量和成员函数给隐藏了
    d.Base::print();//但是,基类中的成员变量和成员函数还是被继承到了子类中,所以通过特殊的方法函数可以访问基类的
                   //成员变量和成员函数
    return 0;
}
原文地址:https://www.cnblogs.com/cplinux/p/5770739.html