虚函数和多态的关系

给力小猫咪 2014-04-02 10:29:48
虚函数和多态是什么关系,virtual怎么用,虚函数是怎么调用的关系是什么啊,请大神指点。谢谢
...全文
203 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
张仕传 2014-04-04
  • 打赏
  • 举报
回复
C++中多态的实现原理 当类中声明虚函数时,编译器会在类中生成一个虚函数表 虚函数表是一个存储类成员函数指针的数据结构 虚函数表是由编译器自动生成与维护的 virtual成员函数会被编译器放入虚函数表中 存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)
苍蝇①号 2014-04-03
  • 打赏
  • 举报
回复
语言这东西知道会用就可以了,非要深究virtual和多态是怎么回事的推荐读《c++对象模型》
「已注销」 2014-04-03
  • 打赏
  • 举报
回复
当父有virtual fun(),子类重写了fun(),CBase *b =new CChild(); b.fun();这里父对象b会调用子类的fun(),而如果父类fun()不加virtual时,则子类的fun()与父类的fun()没有重写的关系,b会直接调用父类fun()
dahaiI0 2014-04-03
  • 打赏
  • 举报
回复
多态分为编译器多态和运行期多态,前者通过模板实现,后者通过虚函数实现,可分别百度下,打字太麻烦了
Fire_Lord 2014-04-03
  • 打赏
  • 举报
回复
虚函数是实现多态的方式。将函数声明为虚函数,在使用的时候就可以通过父类的指针或引用来调用实际指向类型,即子类的具体实现。例如:

class Shape
{
public:
	Shape(){}
	virtual ~Shape(){}

public:
	virtual void Draw() = 0; //纯虚函数,子类必须要重写该函数
	virtual void TestVirtualFunction()  //虚函数,子类可以不重写该函数
	{
		std::cout << "Shape::TestVirtualFunction" << endl; 
	}
};

class Rect : public Shape
{
public:
	Rect():Shape(){}
	virtual ~Rect(){}

	virtual void Draw() //必须重写 Draw 函数
	{
		std::cout << "Rect::Draw" << endl;
	}
};

class Ellipse : public Shape
{
public:
	Ellipse():Shape(){}
	virtual ~Ellipse(){}

	virtual void Draw() //必须重写 Draw 函数
	{
		std::cout << "Ellipse::Draw" << endl;
	}

	virtual void TestVirtualFunction() 
	{
		std::cout << "Ellipse::TestVirtualFunction" << endl; 
	}

};


int main() 
{
	Shape* pRect = new Rect();
	pRect->Draw();					//通过父类指针调用实际对象 Rect的函数,输出 Rect::Draw
	pRect->TestVirtualFunction();	//没有重写基类的虚函数,调用基类的函数,输出: Shape::TestVirtualFunction
	delete pRect;

	Shape* pEllipse = new Ellipse();
	pEllipse->Draw();				//通过基类的指针调用实际对象Ellipse的函数,输出: Ellipse::Draw
	pEllipse->TestVirtualFunction();//通过基类的指针调用实际对象Ellipse的函数,输出: Ellipse::TestVirtualFunction
	delete pEllipse;
}

这是最基本的,最好还是找本教材好好看看。
max_min_ 2014-04-02
  • 打赏
  • 举报
回复
多态需要通过虚函数来体现!多态其实就是基类指针指向实例化的子类对象,从来来调用不同的实现! 至于里面的具体,看看c++对象模型 这本书,侯捷译的
mujiok2003 2014-04-02
  • 打赏
  • 举报
回复
(动态)多态有虚函数实现的。 虚函数如何使用,最好能赵本教材看看。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧