1. 搭配虚函数来继承
- 非虚函数:你不希望派生类重新定义(override)父类的函数;
- 虚函数:你希望派生类重新定义(override)父类的函数,并且你在父类中已经对这个函数有了默认定义;
- 纯虚函数: 你希望派生类一定要重新定义父类的函数,因为你在父类中没有对这个函数有默认定义;
class Shape{
public:
virtual void draw() const = 0; // 纯虚函数(函数=0),派生类必须重新定义,由派生类去决定画什么
virtual void error(const std::string& msg); // 虚函数,派生类有机会重新定义,看是那一种形状出错,自然会调用那一类错误信息
int objectID() const; // 派生类不用重新定义,每个派生类都有一个ID
...
}
class Rectangle : public Shape(){....}
class Ellipse : public Shape() {....}
2. 例子
3. 动态绑定(运行时绑定)
基类通过在其成员函数的声明之前加上virtual关键字,使得该函数执行动态时绑定。当我们使用指针和引用调用虚函数时,该调用将被动态绑定。根据指针或引用所绑定的对象类型不同,该调用可能执行基类的版本,也可能执行某个派生类的版本。
4. 访问继承与控制
- 派生类可以继承定义在基类中的成员,但是派生类的成员函数不一定有权访问从基类继承来的成员。
- 派生类可以访问公有成员,而不能访问私有成员;但是派生类可以访问保护成员。