`
weihe6666
  • 浏览: 440135 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Polymorphism & Virtual Function

    博客分类:
  • C++
C++ 
阅读更多
Polymorphism & Virtual Function


关于C++多态,看下面的例子:
#include <iostream>
using namespace std;

class Shape
{
public:
	virtual void print(){cout << "Call print()" << endl;}
	virtual void draw(){cout << "Call Shape::draw()" << endl;}
};

class Circle : public Shape
{
public:
	Circle(){cout<< "Call Circle Constructor !" << endl;}
	void draw(){cout << "Call Circle::draw()" << endl;}
	void print(){cout << "Call Circle::print()" << endl;}
};
class Square : public Shape
{
public:
	Square(){cout<< "Call Square Constructor !" << endl;}
	void draw(){cout << "Call Square::draw()" << endl;}
};

class Triangle : public Shape
{
public:
	Triangle(){cout<< "Call Triangle Constructor !" << endl;}
	void draw(){cout << "Call Triangle::draw()" << endl;}
};


int main()
{
	typedef void(*Fun)(void);
	Fun pFun = NULL; 

	Shape *A[]={new Circle,new Square,new Triangle};
	Shape *Temp = new Circle;
	Temp->draw();

	pFun = (Fun)*((int*)*(int*)(Temp)); 
	cout << "(int*)(Temp) " << (int*)(Temp) << endl;
	cout << "*(int*)(Temp) " << *(int*)(Temp) << endl;
	cout << "(int*)*(int*)(Temp) " << (int*)*(int*)(Temp) << endl;
	cout << "(Fun)*((int*)*(int*)(Temp)) " << (Fun)*((int*)*(int*)(Temp)) << endl;
	cout << pFun << endl;
        pFun();

	Circle Cir;
	Cir.draw();
	pFun = (Fun)*((int*)*(int*)(&Cir)); 
	pFun();

	Shape Sh;
	Sh.draw();

	return 0;
}



输出为:
Call Circle Constructor !
Call Square Constructor !
Call Triangle Constructor !
Call Circle Constructor !
Call Circle::draw()
(int*)(Temp) 003965D8
*(int*)(Temp) 4290792
(int*)*(int*)(Temp) 004178E8
(Fun)*((int*)*(int*)(Temp)) 004112D0
004112D0
Call Circle::print()
Call Circle Constructor !
Call Circle::draw()
Call Circle::print()
Call Shape::draw()



调试变量的内容为:
Temp                   0x00393ad0
     [Circle]            {...}
          Shape        {...}
               __vfptr   0x004178e8 const Circle::'vftable'
  [0x0]  0x004112d0 Circle::print(void)
   [0x1]  0x00411005 Circle::draw(void)


Cir                      {...} Circle
      Shape              {...} Shape
__vfptr    0x004178e8 const Circle::`vftable'
[0x0]       0x004112d0 Circle::print(void)
[0x1]       0x00411005 Circle::draw(void)


Sh                       {...} Shape
__vfptr       0x00417bf0 const Shape::`vftable'
[0x0]       0x004112c6 Shape::print(void)
[0x1]       0x00411145 Shape::draw(void)

由调试结果可以看出:
Shape *Temp = new Circle; 和Circle Cir; 即Temp和Cir他们的虚函数列表(vtbl)是一样的,他们的虚函数指针(vptr)同指向一个虚函数列表(0x004178e8 const Circle::`vftable')。

当基类有虚函数时每一个子类都有自己的虚函数列表,而且子类的虚函数列表中的函数会覆盖基类的虚函数。当多态的情况发生时,编辑器会动态的绑定对象所要调用的虚函数,比如: Shape *Temp = new Circle; Temp->draw(); 这个Temp->draw();就是在运行时动态的绑定所要调用的虚函数,根据Circle虚函数列表来确定要调用的函数。










分享到:
评论

相关推荐

    Think in C++ 英文版(含卷一、卷二)

    《C++ 编程思想》英文原版,包括卷一与卷二。 ...15: Polymorphism & Virtual Functions 16: Introduction to Templates A: Coding Style B: Programming Guidelines C: Recommended Reading Index

    C++中的虚函数(virtual function)

    ### C++中的虚函数(virtual function) 在C++编程语言中,虚函数是一种非常重要的特性,它主要用于实现多态性(polymorphism),这是面向对象编程的一个核心概念。通过虚函数,程序可以在运行时动态地决定调用哪个具体...

    C++ Polymorphism 笔记 1

    在C++中,多态性主要通过虚函数(virtual function)实现。本文将通过一系列示例来深入探讨C++中的多态性,并解释如何在实际编程中应用这一特性。 #### 二、基础知识回顾 在深入了解多态之前,我们需要先回顾一下...

    多型与虚拟Polymorphism in C++

    1. 函数重载(Function Overloading) 函数重载是指在同一作用域内,可以有多个同名函数,但它们的参数列表不同,即参数类型、个数或顺序不一致。这使得开发者可以根据传入的不同参数调用合适的函数,实现了同名函数...

    Absolute C plus plus

    Polymorphism and Virtual Functions; Templates; Linked Data Structures; Exception Handling; Standard Template Library; Patterns and UML. For all readers interested in the C++ programming language.

    C 程序设计教学课件:CHAPTER 9 POLYMORPHISM.ppt

    在C++编程中,"CHAPTER 9 POLYMORPHISM"这一章节主要讲解了面向对象程序设计中的一个重要概念——多态性(Polymorphism)。多态性是对象导向编程语言的核心特性之一,它允许我们使用一个接口来表示多种类型的行为。...

    C++程序设计教学课件:CHAPTER 9 POLYMORPHISM.ppt

    在C++编程中,多态性(Polymorphism)是面向对象编程的重要特性之一。它允许我们使用同一个函数名或操作符实现不同的功能,具体执行的功能取决于调用时的对象类型。这种灵活性使得代码更具可扩展性和重用性。 9.1 ...

    深入理解c++中virtual关键字

    在C++编程语言中,`virtual`关键字是一个非常重要的特性,它主要用于实现多态性(Polymorphism),这是面向对象编程中的三大基本特征之一。本文将深入探讨`virtual`关键字的作用、使用场景以及相关的概念。 1. **...

    C程序设计教学课件:CHAPTER9POLYMORPHISM.pptx

    在C++编程中,多态性(Polymorphism)是一个至关重要的特性,它体现了面向对象编程的核心理念。多态性允许我们使用一个通用的名字来表示不同的功能或对象,这在运行时提供了极大的灵活性。在本章中,我们将深入探讨...

    深度探索C++对象模型 超清版

    纯虚拟函数的存在(Presence of a Pure Virtual Function) 虚拟规格的存在(Presence of a Virtual Specification) 虚拟规格中const的存在 重新考虑class的声明 5.1 无继承情况下的对象构造 抽象数据类型...

    基于C++的多态模式编写类的代码多态.docx

    在C++中,多态(Polymorphism)是面向对象编程的一个核心概念,它允许我们使用一个接口来表示多种不同的类型。多态性使得代码更加灵活,可扩展性更强,可以减少代码重复,并提高代码的复用性。在这个文档中,通过两...

    虚函数和纯虚函数.pdf

    在C++编程语言中,虚函数(virtual function)和纯虚函数(pure virtual function)是多态性(polymorphism)实现的关键技术,它们支持程序设计中的一种重要特性,即可以使用指向派生类的基类指针来调用相应派生类的...

    6多态性_动态联编_多态性讲述_

    本讲解将深入探讨这两种联编方式,以及虚函数(Virtual Function)、纯虚函数(Pure Virtual Function)和虚析构函数(Virtual Destructor)等关键概念。 静态联编,也称为早期绑定或编译时绑定,是指在编译期间就...

    C++面向对象程序设计模拟试题一.pdf

    1. 虚函数(Virtual Function):虚函数是C++中的一种特殊函数,用于实现多态性。虚函数的关键字是virtual。 2. 程序入口点(Main Function):每个C++程序都需要一个入口点,即main函数,它是程序的起点。 3. ...

    软考程序员复习资料

    * 虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)的定义和应用 * 虚析构函数(Virtual Destructor)的定义和应用 * 内存泄漏(Memory Leak)的定义和解决方法 七、网络编程 * OSI 模型(Open ...

    《深度探索C++对象模型》(Stanley B·Lippman[美] 著,侯捷 译)

    纯虚拟函数的存在(Presence of a Pure Virtual Function) 虚拟规格的存在(Presence of a Virtual Specification) 虚拟规格中const的存在 重新考虑class的声明 5.1 无继承情况下的对象构造 抽象数据类型...

    C++中的多态、重载、覆盖与隐藏

     1、C++中的虚函数(virtual function)  虚函数是C++中用于实现多态(polymorphism)的机制。核心理念是通过基类访问派生类定义的函数。假设我们有下面的类层次: class A { public: virtual void foo() ...

    青岛理工大学c++实验上机实验报告(3).pdf

    - **纯虚函数(Pure Virtual Function)**:形如`virtual function() = 0;`的函数,定义抽象类,无法实例化,用于建立类层次的接口。 实验中提到,理解静态连编和动态连编的区别至关重要。静态连编在编译阶段完成...

    c++实验报告

    在C++中,多态性主要通过虚函数(virtual function)来实现。实验中通过类B和它的派生类D展示了这一点。类B定义了三个虚函数f1、f2和f3,而类D覆盖了这些虚函数。在main函数中,通过基类指针pb指向派生类D的对象,调用...

Global site tag (gtag.js) - Google Analytics