C++的动态联编与虚函数

本文介绍了C++中的动态联编和虚函数,阐述了静态联编与动态联编的区别,重点讨论了虚函数的工作原理、优缺点及使用注意事项。动态联编通过虚函数实现多态,但会带来效率损失。文章提醒开发者在设计时要考虑性能和代码清晰度的平衡。
摘要由CSDN通过智能技术生成

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." 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值