c++的虚函数使用
2017-10-28 16:25
176 查看
虚函数的使用
之前的代码如下:
结果如下:
分析:objp =&obj1,指针指向了对象obj1,调用的函数仍然是基类对象的函数,而不是派生类对象的函数。没有达到目标。
使用虚函数,即可消除二义性。
之后的代码如下:(使用虚函数)
结果如下:
分析:对于虚函数调用来说,每一个对象内部都有一个虚表指针,该虚表指针被初始化为本类的虚表。所以在程序中,不管对象类型如何转换,但该对象内部的虚表指针是固定的,所以才能实现动态的对象函数调用,这就是C++多态性实现的原理。
Note:虚函数的定义在基类中进行,即只有基类中的函数才能被定义为虚函数,在派生类中不能定义某个函数为虚函数。
之前的代码如下:
#include <iostream> using namespace std; class base //定义基类base { int x, y; //定义基类私有成员 public: base(int xx = 0, int yy = 0) //定义构造函数 { x = xx; y = yy; } void disp() //定义成员函数 { cout << "base: " << x << " " << y << endl; } }; class base1 :public base //定义公有派生类base1 { int z; //定义派生类base1的私有成员 public: base1(int xx, int yy, int zz) :base(xx, yy)//定义派生类的构造函数 { z = zz; } void disp() //定义同名函数 { cout << "base1: " << z << endl; } }; void main() { base obj(3, 4), *objp; //创建基类的对象和对象指针 base1 objp1(1, 2, 3); //创建派生类的对象 objp = &obj; //对象指针指向基类 objp->disp(); //调用基类成员函数 objp = &objp1; //对象指针指向派生类 objp->disp(); //调用派生类成员函数 system("pause"); //保持输出窗口,不闪退 }
结果如下:
分析:objp =&obj1,指针指向了对象obj1,调用的函数仍然是基类对象的函数,而不是派生类对象的函数。没有达到目标。
使用虚函数,即可消除二义性。
之后的代码如下:(使用虚函数)
#include <iostream> using namespace std; class base //定义基类base { int x, y; //定义基类私有成员 public: base(int xx = 0, int yy = 0) //定义构造函数 { x = xx; y = yy; } virtual void disp() //定义成员函数,使用虚函数 { cout << "base: " << x << " " << y << endl; } }; class base1 :public base //定义公有派生类base1 { int z; //定义派生类base1的私有成员 public: base1(int xx, int yy, int zz) :base(xx, yy)//定义派生类的构造函数 { z = zz; } void disp() //定义同名函数 { cout << "base1: " << z << endl; } }; void main() { base obj(3, 4), *objp; //创建基类的对象和对象指针 base1 objp1(1, 2, 3); //创建派生类的对象 objp = &obj; //对象指针指向基类 objp->disp(); //调用基类成员函数 objp = &objp1; //对象指针指向派生类 objp->disp(); //调用派生类成员函数 system("pause"); //保持输出窗口,不闪退 }
结果如下:
分析:对于虚函数调用来说,每一个对象内部都有一个虚表指针,该虚表指针被初始化为本类的虚表。所以在程序中,不管对象类型如何转换,但该对象内部的虚表指针是固定的,所以才能实现动态的对象函数调用,这就是C++多态性实现的原理。
Note:虚函数的定义在基类中进行,即只有基类中的函数才能被定义为虚函数,在派生类中不能定义某个函数为虚函数。
相关文章推荐
- [C++]实验四:掌握内联函数的使用、参数个数不确定的函数的设计...
- 关于C++中函数指针的使用
- (转)关于C++中函数指针的使用(包含对typedef用法的讨论)
- java中如何使用JNI调用C++写的函数
- C++常用字符串处理函数及使用示例(ASCII)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- C++ qsort example.C++ 快排函数使用示例
- 使用C++异常来取代exit()函数
- [转]C/C++时间函数使用方法
- 使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- C/C++库中使用time.h中函数需要注意
- 转:使用IDispatch::Invoke函数在C++中调用C#实现的托管类库方法
- C++常用字符串处理函数及使用示例
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- C++中使用非静态成员函数代替全局函数
- C++常用字符串处理函数及使用示例
- [C++] 使用const提高函数的健壮性
- C++常用字符串处理函数及使用示例
- 关于C++中函数指针的使用(包含对typedef用法的讨论)