继承可以理解为一个类从另一个类获取成员变量和成员函数的过程,被继承的类称为基类(父类),继承的称为派生类(子类)。
派生类除了拥有基类的函数和变量,还可以拥有心得成员函数和成员变量。
使用继承可以尽可能的减少冗余代码。
可以使用继承的两个典型场景:
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;