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

对象调用派生类,该怎么解决

2012-03-24 
对象调用派生类#includeiostreamusing namespace stdclass Base1{public:int datavoid fun(){coutM

对象调用派生类
#include<iostream>
using namespace std;
class 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;
}
这是第一个程序。
#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;
}这是第二个程序。
我想问第二个程序为什么对象指针在调用实函数时不调用派生类的而调用基类的。但是第一个程序为什么在基类和子类都存在实函数的情况下却又要调用派生类中的实函数。请讲讲


   


   
   
   
   


   

   
 

[解决办法]
关于第一个:
 Derived obj;obj.data=1; obj.fun(); 必然要调用Derived 里的fun()函数 这个就是一般的函数调用
obj.Base1::fun();限定了 fun的作用域就变成了Base1里的fun函数了!最后一个同理!
关于第二个:

一切源于 "virtual" 建议lz看看虚函数那章吧!
推荐一篇博文:http://www.cppblog.com/xczhang/archive/2008/01/20/41508.html

热点排行