C++ 学习(虚函数)

原创 2015年11月21日 13:51:00

1>静态联编,动态联编
将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编
在C语言中,没有函数的重载,所以,在编译过程中就可以完成函数的联编,这种叫静态联编。
而C++中,虚函数的使用,使得在编译过程中我们无法得知使用的是哪一个,所以编译器 只能在程序运行时选择正确的虚函数代码,这种叫动态联编。

2> 虚函数的工作原理
编译器处理虚函数的方法: 给每个对象添加一个隐式的成员,成员中保存了一个指向函数地址数组的指针,这种数组称为,虚函数表,虚函数表存储的是为类对象进行声明的虚函数地址。

3>注意 :
1)如果要用指向对象的引用或指针来调用虚方法,程序将使用为对象类型定义的方法。
就比如:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

class A{

   public:
   virtual void get()
   {
       cout<<"Hello world"<<endl;
   }
};

class B : public A{

  public :
      void get()
      {
          cout<<"B"<<endl;
      }
};

int main()
{
    A * a;
    B b;
    a = &b;
    a->get();
}

这样的话输出的是B;

2) 构造函数不能是虚函数,创建派生类对象是,将调用派生类的构造函数,而不是基类的构造函数,然后,派生类的构造函数将使用基类的构造函数。
3) 析构函数,如果类要是基类的话应当是虚函数。
驾驶额Empoyee是基类,Singer是派生类,并添加一个char *成员,该成员是指向有new分配的内存。当Singer过期的时候,移动会调用~Singer()析构函数来释放内存:
那么

Employee *pe = new String;
。。。
delete pe;

这时候调用的是 ~Employee()析构函数,释放由Singer对象中Employee部分指向的内存,但不会释放新的类成员指向的内存。
但是如果析构函数是虚拟的话,则上述代码先调用 ~Singer析构函数;

4> 友元函数不能是虚函数,因为友元函数不是类成员。

5>如果重新定义继承的方法,应确保与原来的原型完全相同,但如跟返回值类型是基类引用或者指针的时候,则可以修改为指向派生类的引用或指针, 称为返回类型协变。

相关文章推荐

C++虚函数和多态学习笔记

  • 2007年08月31日 13:31
  • 37KB
  • 下载

跟我一起学习C++虚函数--第一篇

我们知道,虚函数作为C++实现多态的方式,具有强大的RTTI(RunTime Type Identification)功能。虚函数使用起来比较简单,但是也很容易出错。本系列将带着你一步一步了解虚函数的...

C++ 学习之路(11):多态性与虚函数

一、多态性: 1、概念: ①不同对象收到相同的消息时,产生不同的动作。即多态性。 ②即用相同的接口访问不同功能的函数,实现“一种接口,多种 ...

C++ Primer Plus学习笔记之虚函数

C++ Primer Plus学习笔记之虚函数 C++语言的多态性有两种类型:静态多态性和动态多态性。函数重载和运算符重载就是静态多态性的具体表现,而动态多态性是指程序运行过程中才动态的确定操作所...

C++ 11 学习3:显示虚函数重载(override)

5.显示虚函数重载 在 C++ 里,在子类中容易意外的重载虚函数。举例来说: struct Base { virtual void some_func(); }; struct Deri...

跟我一起学习C++虚函数--第五篇

在前一篇,我们讨论了在多重继承情况下,具有虚函数的类的内存布局情况。本篇将进一步探索在多重虚拟继承情况下的内存布局情况。            在讨论多重虚拟继承前,我们先对《 浅析GCC...

C/C++日常学习总结(第六篇)多基派生引起的虚函数访问二义性问题&重载,覆盖,隐藏的区别

1.构造函数和析构函数的调用顺序? 析构函数为什么要虚拟?

一步一步学习C++(类)之虚函数和纯虚数

1、 该函数必须与基类的虚函数有相同的名称 2、 该函数必须与基类的虚函数有相同的参数个数和相对应的参数类型。 3、 该函数必须与基类的虚函数有相同的返回值,或满足类型兼容规则的指针,引用...

C++虚函数学习笔记(仅供参考)

1、虚函数的作用: 允许在派生类中重新定义与基类同名的函数,并且可以通过基类的指针或引用来访问基类和派生类中的同名函数。 2、虚函数的工作原理 编译器处理虚函数的方法:对每个对象添加一个隐藏成员...

【好程序员训练营学习笔记分享9】c++ 虚函数和多态

ios培训------我的c语言笔记,期待与您交流!  虚函数和多态 一,多态-- 一个名字,多种语义,一个界面,多种实现; 1.类指针间的关系 关系有四种:(1)基类指针->基类对象,(2)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 学习(虚函数)
举报原因:
原因补充:

(最多只允许输入30个字)