码迷,mamicode.com
首页 > 编程语言 > 详细

C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错

时间:2015-04-17 11:25:14      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近写程序的时候发现,派生类对象的基类函数如果调用基类虚函数,则它将调用的是派生类的对应函数,而不是我想调用的基类的对应函数。</span>

下面用一个例子来说明:

//基类
class Base
{
public:
	void funA();
	virtual void funB();
protected:
private:
};

void Base::funA(){
	cout<<"这是Base类funA()"<<endl;
	funB();
}

void Base::funB(){
	cout<<"这是Base类funB()"<<endl;
}
//派生类
class Derivate :public Base
{
public:
	virtual void funB();
protected:
private:
};


void Derivate::funB(){
	cout<<"这是Derivate类funB()"<<endl;
}
我这里创建了一个基类Base和一个派生类Derivate,其中基类有一个函数funA()和一个虚函数funB()。派生类中,我重写函数funB()。

在Base::funA()中我调用了funB(),那么我想要调用的应该是Base::funB()。现在我们试写一下测试:

void main(){
	cout<<"1、调用派生类对象的funA():"<<endl;
	Derivate tmp;
	tmp.funA();
	cout<<"2、调用基类指针指向派生类对象的funA():"<<endl;
	Base* pBase;
	pBase = &tmp;
	pBase->funA();
}

运行结果是:

技术分享


实际如果我是用派生类对象来调用funA(),那么他将调用Derivate::funB(),而不是Base::funB(),和基类指针指向派生类对象时,运行fun()的结果相同。


解决方法:那么既想要保持funB()函数的多态性,又想在基类能准确调用基类函数Base::funB()应该怎么做呢?那就加上类限定符:

void Base::funA(){
	cout<<"这是Base类funA()"<<endl;
	Base::funB();
}
所以,基类函数调用某虚函数时,要注意加上类限定符。


全部测试代码:

#include <iostream>
using namespace std;
//基类
class Base
{
public:
	void funA();
	virtual void funB();
protected:
private:
};

void Base::funA(){
	cout<<"这是Base类funA()"<<endl;
	funB();
}

void Base::funB(){
	cout<<"这是Base类funB()"<<endl;
}
//派生类
class Derivate :public Base
{
public:
	virtual void funB();
protected:
private:
};



void Derivate::funB(){
	cout<<"这是Derivate类funB()"<<endl;
}



void main(){
	cout<<"1、调用派生类对象的funA():"<<endl;
	Derivate tmp;
	tmp.funA();
	cout<<"2、调用基类指针指向派生类对象的funA():"<<endl;
	Base* pBase;
	pBase = &tmp;
	pBase->funA();
}


C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错

标签:

原文地址:http://blog.csdn.net/szlcw1/article/details/45093145

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!