c++虚函数与继承的问题

#include <iostream>
using namespace std;

 class A     
 {   
  protected:
  int m_data;
  public:     
  A(int data = 0){m_data = data;   }
  int GetData(){return doGetData();}
  virtual   int   doGetData(){  return m_data;/*m_data = 0 */}     //接口,如不直接调用,则调用派生类中实现他的函数
 };     
    
 class B:public   A     
 {     
  protected:
  int m_data;
  public:     
  B(int data = 1){m_data = data;  }
  //这里 A 中的m_data = 0 ,B中的m_data = 1
    
  int doGetData(){  return m_data ;/*m_data = 1 */}   //实现接口  
};  

class C:public B //C继承了A&B类的方法&属性,且未从新定义接口,故接口还是B类中定义的
{     
  protected:
  int m_data;
  public:     
  C(int data = 2){m_data = data;  }
  //这里 A 中的m_data = 0 ,B中的m_data = 1,C 类中的m_data = 2
};


int main()
{
C c(10);

cout<<c.GetData()<<endl;
//本来是要调用C类的GetData(),C中未定义,故调用B中的,但是B中未定义,故调用A中的GetData(),因为A中的doGetData()是虚函数,所以调用
//B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出 1
cout<<c.A::GetData()<<endl;
//因为A中的doGetData()是虚函数,又因为C类中未重定义该接口,所以调用B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出 1
cout<<c.B::GetData()<<endl;
//肯定返回 1 了
cout<<c.C::GetData()<<endl;
//因为C类中未重定义GetData(),故调用从B继承来的GetData(),但是B类也未定义,所以调用A中的GetData(),因为A中的doGetData()是虚函数,所以调用B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出 1
cout<<c.doGetData()<<endl;
//肯定是B类的返回值 1 了
cout<<c.A::doGetData()<<endl;
//因为直接调用了A的doGetData(),所以输出 0 了
cout<<c.B::doGetData()<<endl;
//因为直接调用了B的doGetData(),所以输出 1 了
cout<<c.C::doGetData()<<endl;
//因为C类中未重定义该接口,所以调用B类中的doGetData(),而B类的doGetData()返回B::m_data,故输出 1
system("PAUSE");

return 0;
}


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

原文:http://www.programfan.com/CLUB/showpost.asp?id=21686

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值