码迷,mamicode.com
首页 > 其他好文 > 详细

虚函数的两种特性

时间:2016-08-06 00:18:41      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

在MFC编程中遇到了两种虚函数的特性,看如下代码,B继承于A,C继承于B,D继承于C,E继承于D,F继承于E。

第一种特性:

#include <iostream>
using namespace std;

class A
{
public:
    virtual void vFunc();
};

class B:public A
{
public:
    virtual void vFunc();
};

class C: public B
{
public: 
    virtual void vFunc();
};

class D: public C
{
public: 
    //virtual void vFunc();
};

class E: public D
{
public: 
    //virtual void vFunc();
};

class F: public E
{
public: 
    virtual void vFunc();
};

void A::vFunc()
{
    cout << "vFuncA\n";
}

void B::vFunc()
{
    cout << "vFuncB\n";
}

void C::vFunc()
{
    cout << "vFuncC\n";
}

//void D::vFunc()
//{
//    cout << "vFuncD\n";
//}

//void E::vFunc()
//{
//    cout << "vFuncE\n";
//}
//
void F::vFunc()
{
    cout << "vFuncF\n";
}

void F::show()
{
    D::vFunc();
}

void main(void)
{
    C cc;
    A *ptr = &cc;
    ptr->vFunc();
    getchar();
}

 主函数中创建类C的对象,用ptr指针来指向这个对象,1:然后调用虚函数vFunc(), 运行结果为vFuncC,分析原因:即使D、E、F类都继承了C类且互相继承,但是调用虚函数vFunc还是没有显示他们当中的一个,因为我们只是创建了C这个对象,它只会创建它的父类B、C部分,而不会创建D、E、F部分,因此只会得到vFuncC。

2、如果我们把类C的虚函数vFunc注释掉,运行结果就是vFuncB,因为根本原因是虚函数表的覆盖问题,没注释之前,由于类C的虚函数表中的vFunc覆盖了类B的vFunc,因此通过类C的虚函数表只能运行得到vFuncC;注释掉类C的vFunc以后,就没有虚函数表的覆盖问题了,那么运行得到vFunB了。

 

第二种特性:就是用基类的指针指向派生类对象的地址,来调用派生类中的同名的虚函数,基类指针指向哪一个对象的地址就调用哪一个对象的虚函数,同样也满足热性一,就是如果派生类中没有重写基类同名的虚函数的话,无论基类指针指向派生类对象,还是会调用基类的同名虚函数。

   谢谢阅读,请指正。

虚函数的两种特性

标签:

原文地址:http://www.cnblogs.com/develop-me/p/5742935.html

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