虚函数和实函数的调用问题
#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++里要存在虚函数?”,明白了它,这个问题的答案就明显的了。