C++ Virtual虚函数

发表于:2015-9-29 12:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:CC吊儿郎当    来源:51Testing软件测试网采编

1 #include<iostream>
2 using namespace std;
3 class Base{
4 public:
5     void m()
6     {
7         cout << "it's Base's m() " << endl;
8     }
9     virtual void f()
10     {
11         cout << "it's Base's f()" << endl;
12     }
13 };
14 class Sub: public Base
15 {
16     void m()
17     {
18         cout << "it's Sub's m()" << endl;
19     }
20     void f()
21     {
22         cout << "it's Sub's f()" << endl;
23     }
24 };
25 void main()
26 {
27     Base* base = new Sub;
28     base->f();
29     base->m();
30 }
  上述是以Base为基类,并且Sub派生了Base,同时复写了两个函数f(),m()
  当在主函数main里用Base类型的指针指向Sub类型对象,此时利用Base指针调用f()和m(),那么这个时候问题就来了。
  在默认情况下Base类的指针会调用当前类型的方法,也就是Base::f(),Base::m(),那么应该输出的都是Base方法中的语句
  然而结果输出的是
  为什么会产生这种原因呢?
  因为父类的f()是虚函数,那么当基类指针调用它的派生类对象时,会默认调用多态性对象的相应方法,于是就解释了为什么Base* base->f()调用了派生类Sub的f()的方法,
  由此我们可以知道虚函数Virtual主要是为了解决多态性问题,因为一个基类方法定义后,它的派生类对象会针对此方法进行不同的覆盖实现,即多态性,若你此时利用基类的指针来指向基类的多态性子类,那么就需要利用virtual修饰基类方法,从而可以来调用你所需要的派生类的方法而避免了调用基类的此方法。
  Virtual是C++ OO机制中很重要的一个关键字。在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现。
  还有虚函数析构函数,应用在这样一个问题:在基类为抽象类,并且基类指针指向派生类,想要删除这个基类指针指向的内存时
  先看第一种情况
1 de<iostream>
2 using namespace std;
3 class Base{
4 public:
5     Base()
6     {
7     }
8     ~Base()
9     {
10         cout << "Base has deleted" << endl;
11     }
12 };
13 class Sub: public Base
14 {
15 public:
16     Sub()
17     {
18     }
19     ~Sub()
20     {
21         cout << "Sub has delete" << endl;
22     }
23 };
24 void main()
25 {
26     Base* base = new Sub;
27     delete base;
28     base = NULL;
29 }
  看运行结果
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号