<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(); }
时间: 2024-10-13 19:05:58