当捆绑在程序运行之前完成时,这称为早捆绑(early binding)。
捆绑根据对象的类型,发生在运行时,称为晚捆绑(late binding)。晚捆绑又称为动态捆绑或运行时捆绑。
在派生类中virtual函数的重定义通常称为重写(overriding)。
使用虚函数类的长度:
带有单个虚函数的类,对象的长度是未带虚函数类的长度加上一个void指针的长度。
如果有一个或多个虚函数,编译器都只在这个结构中插入一个单个指针(VPTR)。因此带一个或两个虚函数的类长度是没有区别的。这是因为VPTR指向一个存放函数地址的表。我们只需一个表,因为所有虚函数地址都包含在这个单个表中。
每当创建一个包含有虚函数的类或从包含有虚函数的类派生一个类时, 编译器就为这个类创建一个唯一的VTABLE。
当继承一个抽象类时,必须实现所有的纯虚函数,否则继承出的类也将是一个抽象类。创建一个纯虚函数允许在接口中放置成员函数,而不一定要提供一段可能对这个函数毫无意义的代码。同时,纯虚函数要求继承出的类对它提供一个定义。
建立公共接口的唯一原因是它能对于每个不同的子类有不同的表示。
对象切片实际上是当它拷贝到一个新的对象时,去掉原来对象的一部分,而不是像使用指针或引用那样简单地改变地址的内容。因此,不常使用对象向上类型转换,事实上,通常要提防或防止这种操作。
对于在构造函数中调用一个虚函数的情况,被调用的知识一个函数的本地版本,也就是说,虚机制在构造函数中不工作。在构造函数中调用虚函数都不能得到预期的结果。
构造函数是不能为虚函数的。但析构函数能够且常常必须是虚的。
作为一个准则,任何时候我们的类中都要有一个虚函数,我们应当立即增加一个虚析构函数。这样,我们保证在后面不会出现问题。
在析构函数中,只有成员函数的本地版本被调用,虚机制被忽略。