虚函数
在语法上,给成员函数之前加上virtual关键字
其他成员,如变量,被继承后会占用内存,但是函数的继承的是调用权,子类继承父类的函数,是否需要重新定义?
non-virtual函数:你不希望子类重新定义(覆写)它
virtual(impure):你希望子类重新定义它,它已有默认定义
pure virtual函数:你希望子类必须重新定义该函数,该函数在父类中没有定义,只是声明,父类不知道该如何定义
class Shape{
public:
virtual void draw() const = 0; // pure virtual
virtual void error(const std::string& msg); // impure virtual
int objectID() const; // non-virtual
...
};
class Rectangle: public Shape{...};
class Ellipse: public Shape{...};
虚函数可以让父类中的函数在一段时间之后被子类实现,比如2、3年后,这种设计模式叫Template Method
举例 :PPT打开并读取文件
#include <iostream>
using namespace std;
class CDocument
{
public:
void OnFilerOpen() // cout代替操作
{
cout << "dialog..." << endl;
cout << "check file status..." << endl;
cout << "open file..." << endl;
Serialize();
cout << "close file..." << endl;
cout << "update all views..." << endl;
}
virtual void Serialize() { };
};
// 后来定义的子类 :
class CMyDoc : public CDocument
{
public:
virtual void Serialize()
{
// 只有应用程序本身才知道如何读取自己的文件,所以要在子类写
cout << "CMyDoc::Serialize()" << endl;
}
};
int main()
{
CMyDoc myDoc; // 假设应对File/Open
myDoc.OnFileOpen(); // 这步既会用到父类的,也会用到子类覆写的virtual函数
}
Inheritance+Compositon关系下的构造和析构
构造是先调用子类还是先调用包含的类的那?这个虽然不重要,但是可以了解下,应该是Component,再Base,再Derived?
析构的时候,则是先析构Derived,然后Base,然后Component
Delegation+Inheritance
如何让一个物体在多个窗口展现,而且物体变化,窗口中展现的内容也一同变化?
设计物体类,还有窗口类,物体类中放指向窗口类的指针,即Delegation,窗口类可以派生出很多子类
|