C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错
来源:互联网 发布:java 方法里面套方法 编辑:程序博客网 时间:2024/06/06 18:51
<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();}
0 0
- C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错
- 抽象类 纯虚函数 虚函数 派生类 派生类对象 基类对象 ——调用顺序,用基类调用派生类的方法
- C++ 虚函数 派生类的调用
- 使用派生类对象通过成员函数指针调用基类虚函数之不可能性的证明
- C++派生类函数调用基类的函数
- 虚析构函数(删除基类对象时,先调用派生类的虚构函数,再调用基类虚析构函数)
- 派生类构造函数的调用顺序
- 虚基类和派生类的函数调用
- 派生类构造函数的调用顺序
- 成员函数被调用派生类对象!
- 内嵌子对象时派生类构造函数与析构函数的调用顺序
- 构造函数访问权限和基类构造函数,派生类的构造函数调用顺序
- 派生类构造函数和析构函数的调用顺序(C++)
- 派生类调用基类的构造函数
- 派生类中调用基类的构造函数
- 基类与派生类的构造函数调用问题
- C++基类与派生类的函数调用情况
- 派生类和基类的函数调用
- nginx模块_使用gdb调试nginx源码
- linux驱动学习笔记(linux驱动头文件说明)
- thinkPHP后台查询mySQL中数据时,当没有符合条件的记录count结果集的值为1
- Gaussian discriminant analysis and Gaussian Mixture Model
- Excel Sheet Column Title
- C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错
- 用VC++访问文本文件(好)|getcpinfo 头文件
- [Android Studio][NDK]Execution failed for task ':app:compileDebugNdk'. Error Code:2
- java jni初识
- java编程:三种方法实现斐波那契数列
- Log4j笔记
- 黑马程序员——java基础知识之网络编程(二)
- Web开发笔记 servlet简介
- [BZOJ1030]JSOI2007文本生成器