C++的动态联编与虚函数
前言
函数名联编(binding):将源代码中的函数调用解释为执行特定的函数代码块的过程。
静态联编:在编译过程中进行联编叫作静态联编。
动态联编:程序运行时才选择需要执行的代码叫作动态联编。
指针和引用的兼容性
将派生类引用或指针转换为基类引用或指针,称为向上强制转换,可隐式。示例如下:
class Animal {
/* 基类 */
};
class Dog: public Animal {
/* 派生类 */
};
int main() {
Animal* dogOne = new Dog();
/* `new Dog()`返回派生类指针,但可以赋值给基类指针`dogOne` */
Dog dogTwo;
Animal& dogTwoRef = dogTwo; /* 基类引用指向了派生类对象 */
return 0;
}
上述代码中,new Dog()
返回派生类指针,但可以赋值给基类指针dogOne
;作为基类引用的dogTwoRef
指向了派生类对象dogTwo
。编译这段代码不会报错,这是因为C++允许这样,本质上是发生了向上强制转换,体现了指针和引用的兼容性。
基类指针或引用转换为派生类指针或引用被称为向下强制转换,要求必须显式地转换。
静态联编与动态联编
设计一个类时,可以将成员函数设计为虚函数(virtual)和非虚函数,函数“虚不虚”,直接影响了编译器对代码的处理方式。这里有一个结论:编译器对非虚函数使用静态联编;对虚函数使用动态联编。
通过一个简单示例,我们看看里边区别:
class Animal {
public:
void run() {
cout << "not implemented." << endl; } /* 非虚函数 */
virtual void fly() {
cout << "not implemented."