C++中的虚函数的实现方法

学习 C++ 的同志不知道有没有和我一样遇到过这样的困惑:C++中的虚函数到底怎么实现的?在各种继承关系中,虚函数表的结构到底是什么样的?曾经我是很想当然,可是后来在使用ATL的过程中,我发现并不是我想的那样。大家知道,利用C++语言本身的特性进行COM编程当然是很方便的事,但是你就得随时随地都知道那虚函数表里头到底是些什么东西。讲C++语法的书没有义务告诉你C++产生的虚函数表是什么样的,这就是头痛的所在。

自已做试验是件很快乐的事,我很愿意这么做。

首先写个函数,作为我们实验的基础。传入虚函数表指针,显示虚数表的内容。

void DispVFT(DWORD* pVFT)
{
printf("VFT Pointer:%p\n" , pVFT);
printf("Begin\n");
DWORD* p = (DWORD* )*pVFT;//得到VFT的首址
while(*p) file://这个地方我是看表项是不是为空来判断是否到了表尾,
file://大多数情况都是对的,不过不能为准
{
printf("VF:%p , %p\n", p , *p);
p++;
}
printf("End\n\n");
}

首先我们看单个类时的虚函数表的情况:

class C1
{
public:
C1()
{
file://printf(%22in/ C1\n");
file://dispvft((dword*)this/);
};
virtual F1()
{}
};
void main()
{
C1 c1;
file://由于C1中没有成员数据,所有我们可以用这种方式判断
file://c1/中的虚函数表指针的个数
printf("vftptr count :%d\n" , sizeof(C1) / 4);
file://显示内存结构
DispVFT((DWORD* )&c1);
}

输出:

vftptr count :1
VFT Pointer:0012FF7C
Begin
VF:00420048 , 00401078(C1::F1)
End

时间: 2024-10-31 12:21:34

C++中的虚函数的实现方法的相关文章

c++ 构造函数中调用虚函数的实现方法_C 语言

我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数.这种调用都是对象已经构建完成的情况.那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A { public: A ():m_iVal(0){test();} virtual void func() { std::cout<<m_iVal<<' ';} void test(){func();} public: int m_iVal; }; class B : public A {

PHP5中虚函数的实现方法分享_php技巧

请看下面的代码: 复制代码 代码如下: <?php class A { public function x() { echo "A::x() was called.\n"; } public function y() { self::x(); echo "A::y() was called.\n"; } public function z() { $this->x(); echo "A::z() was called.\n"; } }

实例讲解C++编程中的虚函数与虚基类_C 语言

虚函数① #include "stdafx.h" #include <iostream> using namespace std; class B0//基类B0声明 { public: void display(){cout<<"B0::display()"<<endl;}//公有成员函数 }; class B1: public B0//公有派生类B1声明 { public: void display(){cout<<

详解C++编程中的虚函数_C 语言

我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是"重复定义".但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数. 人们提出这样的设想,能否用同一个调用形式,既能调用派生类又能调用基类的同名函数.在程序中不是通过不同的对象名去调用不同派生层次中的同名函数,而是通过指针调用它们.例如,用同一个语句"pt->display( );"可以调用不同派生层次中的display函数,只需在调用前

浅析C++中的虚函数_C 语言

一.定义定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数. 语法:virtual 函数返回类型函数名(参数表) { 函数体 } 用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数 虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public. 定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数. 二.作用虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函

C++中的虚函数

虽然很难找到一本不讨论多态性的C++书籍或杂志,但是,大多数这类讨论使多态性和C++虚函数的使用看起来很难.我打算在这篇文章中通过从几个方面和结合一些例子使读者理解在C++中的虚函数实现技术.说明一点,写这篇文章只是想和大家交流学习经验因为本人学识浅薄,难免有一些错误和不足,希望大家批评和指正,在此深表感谢! 一.基本概念 首先,C++通过虚函数实现多态."无论发送消息的对象属于什么类,它们均发送具有同一形式的消息,对消息的处理方式可能随接手消息的对象而变"的处理方式被称为多态性.&q

.NET中的虚函数

面向对象的程序设计有三大要素,封装.继承和多态.虚函数是多态的重要组成部分,同时又在类的继承关系中有着很多变化.本文讨论.NET中对虚函数的支持. 首先,我们通过一个例子来看看虚函数的普通用法: class CA { public virtual void Foo() { Console.WriteLine("CA.Foo"); } } class CB : CA { public override void Foo() { Console.WriteLine("CB.Foo

MySQL中的SQRT函数的使用方法

  这篇文章主要介绍了详解MySQL中的SQRT函数的使用方法,是MySQL入门学习中的基础知识,需要的朋友可以参考下 MySQL的SQRT函数是用来计算出任何数量的平方根.可以使用SELECT语句找出方检定根的任意数如下: ? 1 2 3 4 5 6 7 mysql> select SQRT(16); +----------+ | SQRT(16) | +----------+ | 4.000000 | +----------+ 1 row in set (0.00 sec) 所看到的浮点值,

SQL中实现SPLIT函数几种方法总结(必看篇)_Mysql

例1 代码如下 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(a varchar(100)) --实现split功能 的函数 --date :2003-10-14 as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@Sou