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++学习笔记(一) 补充篇 基础语法 — 参考慕课网 值得推荐!

2016年8月23日 前段时间真的是恍然大悟,书看错了,我看的 C++ prime plus看的真心的难受,也不知道这本书到底在写什么。 2016年8月28日 一晃又过了4-5天,真快啊,发现那...
  • David_Han008
  • David_Han008
  • 2016年08月25日 16:47
  • 2921

c++中的虚函数、虚基类、类模板

一、虚函数 首先要明白C++为什么要引进虚函数这个机制, 虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过...
  • zyazky
  • zyazky
  • 2016年08月15日 14:17
  • 1580

c++中的 虚函数 纯虚函数 虚基类

原文出自http://blog.csdn.net/dardgen/article/details/18790977 虚函数 ,纯虚函数, 虚基类,它们都和virtual有关,这三个带有虚字的...
  • a345203172
  • a345203172
  • 2014年03月21日 10:07
  • 4637

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

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

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

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

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

上一篇我们讨论了在单一继承的情况下,具有虚函数的类对象的内存布局情况。本篇主要讨论在多继承情况下,对象的内存布局。     看例子: 01 #incl...
  • nutchlover
  • nutchlover
  • 2012年07月18日 12:50
  • 331

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

1.构造函数和析构函数的调用顺序? 析构函数为什么要虚拟?
  • wu_123_456
  • wu_123_456
  • 2014年04月25日 16:28
  • 982

《黑客免杀攻防学习笔记》——C++继承与虚函数机制

转载请注明出处。 这是这本书中关于逆向C++的唯一一篇总结,前面的基础知识由于去年已经学习过了钱林松老师的《C++反汇编与逆向分析技术》并做了笔记所以就只是看了一下,发现内容大同小异,不过看过一遍之...
  • wuyangbotianshi
  • wuyangbotianshi
  • 2013年12月20日 11:09
  • 881

《C++捷径教程》学习笔记【一】:虚函数

声明虚函数的方法是在基类中的成员函数原型前加上关键字virtual.格式如下:    class 类名{    ……    virtual 类型 函数名(参数表);    ……    };    当一...
  • BeyondHaven
  • BeyondHaven
  • 2011年06月23日 08:57
  • 897

VS2010 C++ 学习笔记(七)virtual 虚函数

virtual 虚函数 demo.cpp #include #include #include "Shape.h" #include "Circle.h" #include "Rect.h"...
  • linbounconstraint
  • linbounconstraint
  • 2015年09月09日 22:16
  • 776
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 学习(虚函数)
举报原因:
原因补充:

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