C++----继承

       继承可以理解为一个类从另一个类获取成员变量和成员函数的过程,被继承的类称为基类(父类),继承的称为派生类(子类)。

        派生类除了拥有基类的函数和变量,还可以拥有心得成员函数和成员变量。

        使用继承可以尽可能的减少冗余代码。

可以使用继承的两个典型场景:

1) 当你创建的类与原来的类相似,只是多了几个成员函数或成员变量,可以使用继承;

2)当你要创建多个类时,他们拥有相似的成员变量或函数,可以使用继承。


【例】假如要建立一个学生人员统计的类,所有人都拥有姓名和年龄,还有出生日期,我们可以将姓名和年龄归为人员类,出生日期归为日期类,学生归为学生类。

#include<iostream>

using namespace std;

class People
{
    protected:
        string m_name;
    public:
        int m_age;
    public:
        People(string n,int a);
        ~People();
};

People::People(string n,int a)
{
    cout << "People constructor!" << endl;
  m_name = n;
    m_age = a;
}
People::~People()
{
    cout << "People Destructor!" << endl;
}


class Date
{
    private:
        int m_year;
        int m_month;
        int m_day;
    public:
        Date(int y,int m,int d);
        int Getyear();
 int Getmonth();
        int Getday();
        ~Date();
};

Date::Date(int y,int m,int d)
{
    cout << "Date Constructor!" << endl;
    m_year = y;
    m_month = m;
    m_day = d;
}

int Date::Getyear()
{
    return m_year;
}
int Date::Getmonth()
{
    return m_year;
}
int Date::Getmonth()
{
    return m_month;
}
int Date::Getday()
{
    return m_day;
}

Date::~Date()
{
    cout << "Date Destructor!" << endl;
}
class Student:public People
{
 private:
        Date m_birthday;
        int m_id;
    public:
        int m_age; //与父类同名的成员变量
    public:
        Student(string n,int a,int id,int y,int m,int d );
        ~Student();
        void show();
};

Student::Student(string n,int a,int id,int y,int m,int d):People(n,a),m_birthday(y,m,d)
{
    cout << "Student Constructor!" << endl;
    m_id = id;
}

void Student::show()
{
    cout << "年:" << m_birthday.Getyear() << " 月:" << m_birthday.Getmonth() << " 日:" << m_birthday.Getday() << endl;
    cout << "姓名:" << m_name << " 年龄:" << m_age << " 学号:" << m_id << endl;

}
Student::~Student()
{
    cout << "Student Destructor!" << endl;
}

int main()
{
    Student s("wang",23,1,1995,4,6);
    s.show();
    cout << "**********************" << endl;
    cout << &s << endl;
    cout << &s.m_age << endl;  //默认访问子类中m_age变量
 cout << &s.People::m_age << endl;
    cout << &s.Student::m_age << endl;
    cout << "**********************" <<endl;

    return 0;
}

结果:

People constructor!
Date Constructor!
Student Constructor!
年:1995 月:4 日:6
姓名:wang 年龄:4493300 学号:1
**********************
0xbff8cedc
0xbff8cef4
0xbff8cee0
0xbff8cef4
**********************
Student Destructor!
Date Destructor!
People Destructor!

当基类与子类出现同名成员变量时,系统默认访问子类变量,若想要访问基类的,要加限制符:基类::变量名。

不同的继承方式会影响基类成员在子类中的访问权限,以下这张表可归类此问题。


在C++中会出现数据类型转换,如把int型转换成char型。

类也是一种数据类型,也可以进行转换,不过这只有发生在基类和派生类之间才有意义。把子类赋值给基类称作向上转型,把基类赋值给子类叫向上转型,一般来说只能向上转型,若要向下转型只能手动输入。

#include<iostream>

using namespace std;

class Base
{
    private:
        int m_a;
    public:
        Base()
        {
            cout << "Base Construct!" << endl;
        }
};

class Derived:public Base
{
    private:
 int m_a;
    public:
    Derived()
    {
        cout << "Derived Construct!" << endl;
    }
};

int main()
{
    Base a;
    Derived b;
    a = b;   //将子类赋值给基类
    // b = a;  // 将基类赋值给子类,不可取,错误
    Base* p = &b; // 将子类指针赋值给基类
    //Derived* q = &a; // 将基类指针赋值给子类,错误
    return 0;

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页