虚函数的调用(1)

虚函数的定义:

在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。

考虑下面两个类:
class Base {public: virtual void f();};
class Derived : Base {public: void f();};
在C++中,类的指针或引用有两种类型:静态类型和动态类型。
Base *b; b = new Derived();
对于b,它的静态类型是左边的Base,动态类型是右边的Derived。
如果我这样调用: b->f();那么这就是一个多态调用,因为f()函数是virtual的。虽然我声明的b是Base类型,但实际上,这个f()调用的是Derived类中的f()函数。
可以简单地这样说,在C++中,如果用一个类的指针或者引用调用函数,且这个函数是virtual的,那么这个调用就是多态的,意思就是,它会调用那个指针或者引用的动态类型(也就是实际类型)的相应的函数。
否则的话,这个调用便是非多态的,也就是它只会调用这个对象的静态类型的相应的函数。
注意,也就是说,除了“类对象指针->虚方法”和“类对象引用.虚方法”外,其他的都是非多态调用。
如: Base b;
b.f();
这肯定是调用的基类中的f();如果把上面例子中,virtual去掉,那么:
Base *b = new Derived;
b->f();
也是调用的基类中的f(),而不是它实际类型Derived类中的f()。

时间: 2024-08-01 00:01:07

虚函数的调用(1)的相关文章

MFC浅析(7) CWnd类虚函数的调用时机、缺省实现

CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4. PreTranslateMessage 5. WindowProc 6. OnCommand 7. OnNotify 8. OnChildNotify 9. DefWindowProc 10. DestroyWindow 11. PostNcDestroy CWnd作为MFC中最基本的与窗口打交

C/C++中虚函数的调用

代码: 1 #include <iostream> 2 3 using namespace std; 4 5 class A{ 6 public: 7 virtual void print(){ 8 cout<<"i am A"<<endl; 9 } 10 }; 11 class B:public A{ 12 public: 13 void print(){ 14 cout<<"i am B"<<endl;

[C++]在构造函数及析构函数中调用虚函数

(ISO/IEC 14882:2011 section 12.7.4): Member functions, including virtual functions (10.3), can be called during construction or destruction (12.6.2).When a virtual function is called directly or indirectly from a constructor or from a destructor, inc

Item 9:在析构/构造时不要调用虚函数 Effective C++笔记

Item 9: Never call virtual functions during construction or destruction. 父类构造期间,对虚函数的调用不会下降至子类.如果这并非你的意图,请不要这样做! 这个问题阿里实习面试曾经问到过,看这篇文章: 2014阿里巴巴面试经历 看Scott Meyers举的例子: class Transaction { // base class for all public: // transactions Transaction(){ /

C++ 虚函数和虚继承浅析

本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析,有希望对大家学习C++有所帮助.下面都是以VC2008编译器对这两种机制内部实现为例. 虚函数 以下是百度百科对于虚函数的解释: 定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数[1] 语法:virtual 函数返回类型 函数名(参数表) { 函数体 } 用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数 函数声明和定义和普通的类成员函数一样,只是在返回值之前加入了关键字"vir

【转载】C/C++杂记:虚函数的实现的基本原理

原文:C/C++杂记:虚函数的实现的基本原理 1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.例: 其中: B的虚函数表中存放着B::foo和B::bar两个函数指针. D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基类虚函数B::bar的D::bar,还有新增的虚函数D::quz. 提示:为了描述方便,本文在探讨对象内存布局时,将忽略内存对齐对布局的影响.

C/C++杂记:虚函数的实现的基本原理

1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针.例: 其中: B的虚函数表中存放着B::foo和B::bar两个函数指针. D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基类虚函数B::bar的D::bar,还有新增的虚函数D::quz. 提示:为了描述方便,本文在探讨对象内存布局时,将忽略内存对齐对布局的影响. 2. 虚函数表构造过程 从编译器的角度来说,

C++纯虚函数、虚函数、实函数、抽象类,重载、重写、重定义

首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象. 虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体差异而采用不同的策略.纯虚函数则是一种特殊的虚函数.虚函数联系到多态,多态联系到继承. 一.虚函

虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout << "A:A" <<endl; } virtual void getb(){ cout << "A:B" <<endl; } }; class B :public A{ public: B(){} virtual void g