一、创建
1、用class来声明一个类,一般用virtual来修饰基类的析构函数,使其变为虚函数,在继承部分会详细说明。
//Child.h
//声明一个 Child类,这个类继承(派生)自Parent基类
//派生类能够继承和访问基类的非private修饰的成员
class Child : public Parent {
public:
//共有成员
Child();//声明默认构造函数
Child(const Child& other); //声明拷贝函数;
const Child& operator=(const Child& other); //声明赋值函数
~Child(); //声明析构函数
private:
int data; //私有成员
};
//Child.cpp
//在cpp文件中实现
//如果不想用基类的默认构造函数,可以通过向基类传入参数来调用其他构造函数来初始化基类成员变量
Child::Child(param) : Parent(param1,param2)
{
}
Child::Child(const Child& other)
{
}
const Child& Child::operator=(const Child& other)
{
// TODO: 在此处插入 return 语句
}
Child::~Child()
{
}
二、继承
1、不使用基类构造函数
派生类在继承基类时,可以继承和访问基类public、protected修饰的成员。
当创建派生类实例时,会先调用基类的构造函数(一般是默认构造函数),再调用派生类的构造函数;创建派生类实例销毁时,则顺序相反,先调用派生类析构函数、再调用基类析构函数。
//定义一个基类Base和他的派生类Derived
class Base {
public:
Base() {
std::cout << "Base()\n";
}
~Base() {
std::cout << "~Base()\n";
}
};
class Derived : public Base {
public:
Derived() {
std::cout << "Derived()\n";
}
~Derived() {
std::cout << "~Derived()\n";
}
};
int main() {
Derived d; //创建派生类Derived的实例d
Base b; //创建基类Base的实例b
return 0;
}
输出结构如下:
//创建派生类Derived的实例时的输出
Base()
Derived()
//创建基类Base的实例b的输出
Base()
//先销毁实例d
~Derived()
~Base()
//后销毁实例b
~Base()
C++中,局部变量是先创建先销毁,故创建时先创建Derived实例d,再创建Base实例b;销毁时,先销毁实例d,再销毁实例b。
在创建Derived实例d时,先执行基类Base的构造函数,再执行派生类Derived的构造函数;
销毁时,先执行派生了的析构函数,再执行基类的析构函数。
2、使用基类构造函数
当想要继承一个基类,拥有其全部功能,但只改写一些成员函数时;可以用using + 基类构造函数名来声明继承其构造函数。这样,当创建派生类时,就会调用基类构造函数。同时、有同名成员函数,会隐藏基类的成员函数,这样就起到只改写一些功能而不会影响其他操作。
//例如继承string类
using std::string::string; // 继承构造函数
三、多态
1、静态多态
1.1 重载
2 、动态多态
1.2 重写