#include<iostream>
#include<string>
using namespace std;
///考察的是类作用域、覆盖和隐藏,参考primer c++的p547
//在成员函数中调用虚函数 https://blog.youkuaiyun.com/li_haoren/article/details/86165690
class one{
public:
one(int data = 0):mdata(data){
cout<<"one"<<endl;
}
// one(){
// cout<<"one"<<endl;
// }
int data(){
return get_data(); //这条语句是多态的
//“get_data();”等价于“this->get_data();”,而this指针显然是one*类型的,
//即是一个基类指针,那么“this->func2();”就是在通过基类指针调用虚函数,因此这条函数调用语句就是多态的
}
virtual int get_data(){
return mdata;
}
protected:
int mdata;
};
class two:public one{
public:
two(int data = 1):mdata(data){
cout<<"two"<<endl;
}
int get_data(){
return mdata;
}
protected:
int mdata;
};
class three:public two{
public:
three(int data = 2):mdata(data){
cout<<"three"<<endl;
}
// int get_data(){ //加上输出就是:3 3 3 3
// return mdata; // 3 0 1 3
// }
protected:
int mdata;
};
int main(){
three t(3); //其实继承对成员函数的本质是:可以访问父类作用域的函数
cout<<t.data()<<" "<<t.one::data()<<" "<<t.two::data()<<" "<<t.three::data()<<" "<<endl
///本来就是调用的就是继承下来的one::的data(),动态绑定时传入的this是第三个类的,所以都是调用的第三个类的,而第三类没有重写虚函数,
///用的是从第二个类(重写了虚函数)中继承下来的,所以真正调用的是第二个类的
//下面的输出不会出现动态绑定,因为没有通过指针或者引用调用虚函数。
//考察的是类作用域,three类没有重新定义get_data()函数,所以会从其父类中找,找到了two中的get_data()函数,所以t.get_data()执行的是two中的函数,输出的也是two中的成员,值为1。
<<t.get_data()<<" "<<t.one::get_data()<<" "<<t.two::get_data()<<" "<<t.three::get_data()<<endl;
//最后输出:
//1 1 1 1
//1 0 1 1
}