多态继承
多态继承是C++中实现代码重用的一个重要方法。例如最刚开始的时候定义了一个基础类Base
:
class Base{
private:
string name;
public:
Base(string n): name(n){}
void show(){
cout << "Using base function: " << name << endl;
}
};
这个类只是实现了最基本的功能,但是如果临时想为该类添加一个新的功能,就要在Base
的源代码中做改动。但是有了继承功能之后,就能在Base
类的基础上新定义一个类,新定义的类会继承Base
类的所有数据,并且在定义的同时,可以额外增加新的数据。
公有继承
假设我们要在Base
类的基础上定义一个新的类Derived
,其基本语法如下:
class Derived : public Base{
private:
int age;
public:
Derived(string n, int a): Base(n), age(a){} //用构造函数初始化列表调用基类的构造函数
void show(){
Base::show(); //用域解析符调用基类的同名函数
cout << "Using derived function: " << age << endl;
}
};
上面的代码示例有两个需要注意的点:
- 类的继承并不会继承基类的构造函数,如果不在派生类的构造函数中显式调用,编译器会自动调用基类的默认构造函数来初始化基类相对应的数据内容。并且如果要在派生类的构造函数中显式调用基类的构造函数,只能通过
构造函数初始化列表的方式
调用。 - 派生类可以直接调用基类中的
public函数
,但是如果碰到基类中与派生类中同名的函数,则需要使用域解析符修饰基类中的方法。
这样之后,我们就让Derived
类继承了Base
类。继承了Base
类之后,Derived
类拥有所有Base
类的数据,但是不能直接访问Base
类的private
数据,而只能访问public
和protected
数据。基类所有的protected
成员都会变成派生类的protected
成员,而所有的public
成员都会成为派生类的public
成员,所以叫公有继承。如果基类的public
成员变成派生类的protected
成员则称为protected
继承,相应的也有private
继承。这些在后面会讲到。
多态继承,不同的行为
接下来对Base
和Derived
两个类进行实验:
Base b("Base Class");
Derived d("Derived Class", 23);
b.show();
d.show();
上面程序的输出为:
Using base function: Base Class
Using base function: Derived Class
Using derived function: 23
可以看到,从Base
类中派生出来的Derive