前言
继承和多态发生在类里面,继承就相当于一个类能够继承另一个类的函数和成员。继承的类被称为子类,被继承的类被称为父类。本文会简单的举例一些继承的使用和介绍一些继承的多种因素,各种注意事项之类的内容。
另外,这里是根据我自己的理解做的一些讲述,一些部分可能不全面。这时请参考其他博主的博客。
一、什么是继承
继承,会保持原有特性的基础上进行扩展,增加成员函数,成员变量。例如:水果是在植物这个类里面的,所以水果包含植物的特性。这时水果被称为子类也称为派生类,而植物被称为父类也称为基类。
在C++中继承分为三种方式public继承、protect继承、private继承。对应的父类中三种不同的成员有不同的继承效果。具体效果如下所示:
其中基类的private成员在派生类中都是不可见的,public继承会继承所有相对应的属性。
二、继承的写法
继承的写法需要给明继承的方式以及继承的对象,写在派生类对象的分号后面:
class Person
{
protected:
string _name;
};
class Student : public Person
{
protected:
string _id;
}
例如上图,Student就public继承了Person。当然继承方式不写会有默认的继承方式,class的默认继承方式是private继承,struct的默认继承方式是public继承。
也可以增加模版继承,不过如果需要调用末班中的函数就需要声明清楚模版是什么,例如:
template<class T>
class Stack : public vector<T>
{
public:
void push(const T& x)
{
vector<T>::push_back(x); // 显示调用
}
size_t size()
{
return vector<T>::size(); // 显示调用
}
};
int main()
{
Stack<int> st;
st.push(1);
st.push(2);
st.push(3);
st.push(4);
cout << st.size() << endl;
return 0;
}
这种也就是模版的按需实例化,如果不写vector<T>::指定,那么编译会报错。
在继承中有以下特性:
1、子类对象可以复制给父类对象/指针/引用(因为是有的时候能对子类进行切割找到父类)
2、父类对象不能复制给子类对象。指针和引用可以,但是需要原来的指针和引用指向的是子类对象。如果需要判断父类的指针/引用是否指向子类,可以使用dynamic_const()函数。
三、继承中的函数
由于基类和派生类是继承关系,所以基类的成员在派生类其他成员的前面。
1、构造函数
构造函数如果不显示调用,子类会自动调用父类的默认构造,如果没有默认构造,就需要主动显示调用,构造函数会优先调用父类的构造函数:
class Person
{
public:
Person(const int& id)
:_id(id)
{}
protected: