首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

虚函数和实函数的调用有关问题

2012-03-29 
虚函数和实函数的调用问题#includeiostream#includecstringusing namespace stdclass Base{char base

虚函数和实函数的调用问题
#include<iostream>
#include<cstring>
using namespace std;
class Base{
  char base_name[10];
public:
  Base(){strcpy(base_name,"BASE");}
  virtual char *my_name(){return base_name;}
  char *class_name(){return base_name;}
};
class Derived:public Base{
  char derived_name[10];
public:
  Derived(){strcpy(derived_name,"DERIVED");}
  char *my_name(){return derived_name;}
  char *class_name(){return derived_name;}
};
void show_ptr(Base *p){
  cout<<endl<<p->my_name()<<" "<<p->class_name();
}
void show_ref(Base &r){
  cout<<endl<<r.my_name()<<" "<<r.class_name();
}
int main(){
  Base bb;
  Derived dd;
  cout<<endl;
  show_ptr(&bb);cout<<"<==应显示'BASE BASE'";
  show_ptr(&dd);cout<<"<==应显示'DERIVED BASE'";
  cout<<endl;
  show_ref(bb); cout<<"<==应显示'BASE BASE'";
  show_ref(dd); cout<<"<==应显示'DERIVED BASE'";
  cout<<endl;
  cout<<endl<<dd.Base::my_name()<<" "<<dd.Base::class_name();
  cout<<"<==应显示'BASE BASE'";
  return 0;
}这是第一个程序。
#include<iostream>
using namespace std;
calss Base1
{
public:
  int data;
  void fun(){cout<<"Member of Base1."<<endl;}
};
class Base2
{
public:
  int data;
  void fun(){cout<<"Member of Base2."<<endl;}
};
class Derived:public Base1,public Base2
{
public:
  int data;
  void fun(){cout<<"Member of Derived."<<endl;}
};
int main()
{  
  Derived obj;
  obj.data=1;
  obj.fun();
  obj.Base1::data=2;
  obj.Base1::fun();
  obj.Base2::data=3;
  obj.Base2::fun();
  return 0;
}这是第二个程序。
第一个程序中,派生类的对象调用调用共同的实函数时,调用的是基类中的实函数,第二个程序中,派生类的对象调用共同的实函数时,调用的是派生类的实函数。书上说当里层类声明了和外层一样的函数时,里层会覆盖外层,调用基函数时,调用的是派生类里的同名函数,但是为什么这个结论在第一个程序不适用。我的书是考二级用的书,不是很详细。所以知道的请讲讲。不要叫我去看书。我看了n遍了。谢谢
   
   
   

 

[解决办法]
show_ptr(&dd);cout<<"<==应显示'DERIVED BASE'";
注意参数哦!dd是子类对象,而show_ptr接收的是基类地址!
所这里有一个隐含的转换,即用基类指针指向子类对象。这正是虚函数的应用之处。
如果一个函数是虚函数,则:
用基类指针指向基类对象时,调用的函数就是基类的。
用基类指针指向子类对象时,调用的函数就是子类的。

可以去c++ primer等书上翻一翻“为什么C++里要存在虚函数?”,明白了它,这个问题的答案就明显的了。

热点排行