Virtual表

//在头文件中
#ifndef __CBASE_H__
#define __CBASE_H__

#include <iostream>
using std::cout;
using std::endl;
class CBase
{
public:
	virtual void f1()
	{
		cout<<"你妈妈喊你回家吃饭...."<<endl;
	}
	virtual void f2()
	{
		cout<<"神马都是浮云"<<endl;
	}
	virtual void f3()
	{
		cout<<"浮云回家吃饭了....."<<endl;
	}

};

#endif


//在主文件里
#include "stdafx.h"
#include "CBase.h"


int _tmain(int argc, _TCHAR* argv[])
{
	CBase d, *pd = &d;
	
	for (int i = 0; i < 3; ++i)
	((void (*)())(*((int*)(*((int*)pd))+i)))();
	return 0;
}


虚函数是动态函数的基础。

但是只能用于非静态非友元非内联的成员函数。(以上函数均没有this指针)

virtual只能用于说明类声明时的原型,实现时不能写。

具有继承性,基类中声明了虚函数,派生类中不论是否说明,同原型的函数自动为虚函数。

不是重载,而是重写。调用方式:通过基类类型的指针或者引用。执行时会根据指针指向对象的类型,决定调用哪个类的成员函数。一个指向基类的的指针,可以用来指向从基类中公有派生的任何对象,(注意必须是公有派生,兼容性原则)

virtual的作用就是使继承于基类的各派生类,肩负了重写虚函数的责任。

虚函数本身虽然不能是外来的友元函数,但可以外派出去,成为其他类的友元函数。

如果一个类中含有虚函数,则编译器对其生成的对象添加一个void型的指向指针的指针(它指向了一个指针数组<虚表>);

 

 

 

在C++中,virtual关键字用于声明虚函数,即可以被子类重写的基类函数。当一个类定义了一个虚函数时,它会自动创建一个虚函数,存储所有虚函数的地址。每个对象都有一个指向虚函数的指针,当调用虚函数时,会根据对象指针找到对应的虚函数,并调用正确的虚函数。 使用虚函数可以实现多态性,即不同的对象可以调用同一个虚函数,但可能会有不同的实现。这种特性可以在面向对象的程序设计中提高代码的可复用性和可扩展性。 下面是一个简单的例子: ```c++ #include <iostream> using namespace std; class Shape { public: virtual int getArea() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape { public: int getArea () { cout << "Rectangle class area :" <<endl; return (width * height); } private: int width; int height; }; int main() { Shape *shape; Rectangle rec; shape = &rec; shape->getArea(); return 0; } ``` 输出结果为: ``` Rectangle class area : ``` 在这个例子中,我们定义了一个Shape类和一个Rectangle类,Rectangle类继承自Shape类。Shape类中定义了一个虚函数getArea(),Rectangle类重写了这个函数。在main函数中,我们创建了一个Shape指针指向一个Rectangle对象,并调用了getArea()函数。由于getArea()函数是虚函数,所以会根据对象指针找到对应的虚函数,并调用Rectangle类中的getArea()函数。这个例子展示了虚函数的多态特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值