【CPP-NOTE】动态联编

多态中动态联编特性

联编是指一个计算机程序的不同部分彼此关联的过程。按照联编所进行的阶段不同,可分为两种不同的联编方法:静态联编和动态联编。

源代码中的函数调用解释为执行特定的函数代码被称为函数名联编(binding).

在编译过程中进行联编被称为静态联编(static binding),又称早期联编(early binding).
  编译器必须生成能够在程序运行时选择正确的虚方法的代码,这被称为动态联编(dynamic binding), 又称为晚期联编(late binding).
      1.为什么有两种类型的联编以及为什么默认为静态联编?
      如果动态联编让您能够重新定义类方法,而静态联编在这方面很差,为何摒弃静态联编呢?原因有两个-----效率和概念模型.
      首先来看效率.为使程序能够在运行阶段进行决策,必须采取一些方法来跟踪基类指针或引用指向的对象类型,这增加了额外的开销.例如,如果类不会用作基类,则不需要动态联编.同样,如果派生类不重新定义基类的任何方法,也不需要使用动态联编.在这些情况下,使用静态联编更合理,效率也更高.由于静态联编的效率更高,因此被设置为C++的默认选择.Strousstrup说,C++的指导原则之一是, 不要为不使用的我付出代价(内存或者处理时间).仅当程序设计确实需要虚函数时,才使用它们

    • 成员函数必须声明为virtual,即为虚函数,该函数是动态联编;
    • 动态联编:指联编工作出现在运行时阶段,这种联编又称为晚期联编;
    • 编译程序:在编译阶段并不能确切知道将要调用的函数,只有在程序运行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行; 
      注:这样的好处是实现多态性和比较灵活,但是就要牺牲速度,因为每个函数调用在运行前是不可确定的,要随着用户的操作来执行相应的函数,相应地大大增加了系统的开销。
#include <iostream>

using namespace std;
class father
{
public:
    father(){}
    ~father(){}
public:
    virtual void run() const{cout<<"父亲可以跑1万米"<<endl;}
};
class son : public father
{
public:
    son(){}
    virtual ~son(){}
public:
    void run() const{cout<<"儿子亲可以跑十万米"<<endl;}
};
int main()
{
    father f;
    son s;
    f.run();
    s.run(); //
    f=s;
	f.run(); //输出还是父亲可以跑1万米
    father *q=&s;
    q->run();//指针调用,引用的是 派生类的对象,输出儿子; 

    system("pause");
    return 0;
}

  

时间: 2024-10-09 06:19:55

【CPP-NOTE】动态联编的相关文章

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

c++知识点总结--静态与动态联编

静态联编是指在编译阶段就将函数实现和函数调用关联起来,因此静态联编也叫早绑定,在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型 动态联编是指在程序执行的时候才将函数实现和函数调用关联,因此也叫运行时绑定或者晚绑定,动态联编对函数的选择不是基于指针或者引用,而是基于对象类型,不同的对象类型将做出不同的编译结果.C++中一般情况下联编也是静态联编,但是一旦涉及到多态和虚拟函数就必须要使用动态联编了. 类与类指针 父类指针引用父类对象,完全

静态联编和动态联编初认识。

多态性: 静态联编多态性(编译时的多态性)通过函数,运算符的重载实现的(系统根据形参的个数来实现编译的多态性) 动态联编多态性(运行时的多态性)通过继承,虚函数(当运行时才能实现对象与函数的联编)C++规定:动态联编是在虚函数的支持下实现的 条件:指向派生类对象的基类指针或者引用派生类对象的基类引用(调用虚函数) 动态联编: 1 #include <iostream> 2 using namespace std; 3 class shape{ 4 public: 5 void virtual

静态联编和动态联编

1.联编是指对于相同名字的若干个函数的选择问题 2.实例 #include <iostream> using namespace std; const double PI = 3.1415926; class Point { private: double x,y; public: Point(double i,double j) { x = i; y = j; } double Area() { return 0; } }; class Rectangle:public Point//矩形类

C++ 虚函数、静态联编和动态联编、抽象类

 //C++ 虚函数.静态联编和动态联编.抽象类 #include<iostream> #include<string> using namespace std; class People { private: string name; int age; public: People(string name_, int age_):name(name_), age(age_){} People(){cout << "基类默认构造函数" <&

C++之静态联编和动态联编

联编是指一个程序自身彼此关联的一个过程.按照联编所进行的阶段不同,可分为静态联编和动态联编两种. 静态联编 静态联编是指在程序编译连接阶段进行联编.这种联编又称为早期联编,这是因为这种联编工作是在程序运行之前完成的. 编译时所进行的联编又称为静态束定.束定是指确定所调用的函数与执行该函数代码之间的关系. 下面来看一个静态联编的程序例题: <span style="font-size:18px;">#include <iostream> using namespa

java动态联编

JAVA中联编有两种,一种是动态联编,一种是静态联编. 动态联编:也叫多态联编或者是迟后联编,因为到底要调用哪一个函数,在编译时不能确定,而要推迟到运行中确定.也就是说,要等到程序运行时,确定了指针所指向对象的类型时,才能够确定. 静态联编:静态联编是指联编工作出现在编译连接阶段,这种联编又称作早期联编,因为这种联编工作是程序开始运行之前完成的. 静态联编的条件:类方法(静态方法),类变量(静态类型变量). EXM: public class Par_Test{  //基类 public sta

【转】C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable

首先,说起多态就必须要讲静态联编,动态联编.这俩也叫静态绑定和动态绑定.有些书比如C++ Primer也叫静态类型和动态类型.谭浩强写的C++程序设计直接叫静态多态性和动态多态性. 文章转载自:原文链接

C++的静态联编和动态联编

联编的概念 联编是指一个计算机程序自身彼此关联的过程,在这个联编过程中,需要确定程序中的操作调用(函数调用)与执行该操作(函数)的代码段之间的映射关系. 意思就是这个函数的实现有多种,联编就是把调用和对应的实现进行映射的操作.按照联编进行的阶段不同,可分为静态联编和动态联编. 静态联编 静态联编工作是在程序编译连接阶段进行的,这种联编又称为早期联编,因为这种联编实在程序开始运行之前完成的.在程序编译阶段进行的这种联编在编译时就解决了程序的操作调用与执行该操作代码间的关系. 动态联编 编译程序在编