RSS

虚函数使用方法

编译系统按照同名覆盖的原则决定调用的对象。

当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数。

那么虚表指针在什么时候,或者说在什么地方初始化呢?答案是**在构造函数中进行虚表的创建和虚表指针的初始化**。

这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。

组委会做好其它准备工作后,就等运动会开始了(编译完毕。

未经许可,请勿用于商业用途_**)**,1\\.概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。

__言归正传,让我们一起进入虚函数的世界。

虚函数声明如下:virtualReturnTypeFunctionName(Parameter);虚函数必须实现,如果不实现,编译器将报错,错误提示为:errorLNK****:unresolvedexternalsymbol”public:virtualvoid__thiscallClassName::virtualFunctionName(void)”3、对于虚函数来说,父类和子类都有各自的版本。

由于Base类和Derive类都包含了一个虚函数func(),编译器会为这两个类都建立一个虚表,(即使子类里面没有virtual函数,但是其父类里面有,所以子类中也有了)那么如何定位虚表呢?编译器另外还为每个类的对象提供了一个虚表指针(即vptr),这个指针指向了对象所属类的虚表。

例如,用同一个语句pt->display();可以调用不同派生层次中的display函数,只需在调用前给指针变量pt赋以不同的值(使之指向不同的类对象)即可。

__这里我们着重看一下这张虚函数表。

这句话也可以反过来说:如果你发现基类提供了虚函数,那么你最好override它。

**为什么类的静态成员函数不能为虚函数:**如果定义为虚函数,那么它就是动态绑定的,也就是在派生类中可以被覆盖的,这与静态成员函数的定义(:在内存中只有一份拷贝;通过类名或对象引用访问静态成员)本身就是相矛盾的。

虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。

转载https://www.cnblogs.com/weiyouqing/p/7544988.html在面向对象的C++语言中,虚函数(virtualfunction)是一个非常重要的概念。

同时大家都说虚函数的效率低,其原因就是,在调用虚函数之前,还调用了获得虚函数地址的代码。

输出的结构是12,实际调试反汇编的时候发现,D中继承了B和C的vbtable,这就是8字节,而同时还保存了一个A的副本,4字节,总共12字节。

它和上面的多重虚继承例子里的12字节是不一样的。

,什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始)简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。


Your Comment