您的位置:首页 > 其它

继承层次中 this,名字查找 导致的成员调用问题

2013-05-02 13:14 337 查看
这种问题首先得清楚调用的是哪一个版本的函数!!然后就可以知道该函数所在的作用域

 

 代码一:

#include <iostream>
using namespace std;

class A
{
public:
void CallPrint()const;
private:
virtual void print()const;

};
void A::CallPrint()const
{
print();
}
void A::print()const
{
cout<<"call A print"<<endl;
}

class B:public A
{
private:
void print()const;
};
void B::print()const
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.CallPrint();
return 0;
}

 

结果是:call B print

因为print是虚函数,而目标对象的类型是B 或者说this指针指向的动态类型是B,所以调用的是B类的print,所以在CallPrint 内部使用了多态。其实CallPrint内部等价于A *const this=&obj; this->print();这样写相信大家都非常明白了吧。

 

代码二:

#include <iostream>
using namespace std;

class A
{
public:
void CallPrint()const;
void print()const;

};
void A::CallPrint()const
{
print();
}
void A::print()const
{
cout<<"call A print"<<endl;
}

class B:public A
{
public:
void print()const;
};
void B::print()const
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.CallPrint();
return 0;
}

结果是:call A print

可以知道调用的是A类的print,因为print是非虚函数,先在A的作用域中找,所以调用的是基类A的print函数,其实CallPrint内部等价于A *const this=&obj; this->print();这样写相信大家都非常明白了

代码三:

#include <iostream>
using namespace std;

class A
{
public:
void CallPrint()const;
virtual void print(double val)const;

};
void A::CallPrint()const
{
print(3);
}
void A::print(double val)const
{
cout<<"call A print"<<endl;
}

class B:public A
{
public:
void print(int val)const;
};
void B::print(int val)const
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.CallPrint();
return 0;
}

结果是:call A print

代码四:

#include <iostream>
using namespace std;
class A
{
public:
A():m(2){}
virtual void PrintMem()const;
protected:
int m;
};
void A::PrintMem()const
{
cout<<m<<endl;
}

class B:public A
{
public:
B():m(3){}
void PrintMem()const;
protected:
int m;
};
void B::PrintMem()const
{
cout<<m<<endl;
}
int main()
{
B obj;
obj.PrintMem();
return 0;
}

结果是:3

代码五:

#include <iostream>
using namespace std;
class A
{
public:
A():m(2){}
void PrintMem()const;
protected:
int m;
};
void A::PrintMem()const
{
cout<<m<<endl;
}

class B:public A
{
public:
B():m(3){}
void PrintMem()const;
protected:
int m;
};
void B::PrintMem()const
{
cout<<m<<endl;
}
int main()
{
B obj;
obj.PrintMem();
return 0;
}


结果是:3

代码六:

#include <iostream>
using namespace std;

class A
{
public:
A():m(2){}
void PrintMem()const;
protected:
int m;
};
void A::PrintMem()const
{
cout<<m<<endl;
}

class B:public A
{
public:
B():m(3){}
protected:
int m;
};
int main()
{
B obj;
obj.PrintMem();
return 0;
}


结果是:2

 代码七:

#include <iostream>
using namespace std;
class A
{
public:
virtual void print(int value)const;
};
void A::print(int value)const
{
cout<<"call A print"<<endl;
}
class B:public A
{
public:
void print(double value)const;
};
void B::print(double)const
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.print(3);
A *p=&obj;
p->print(3);
return 0;
}


结果是:call B print

                call A print

 

 代码八:

#include <iostream>
using namespace std;
class A
{
public:
virtual void print()const;
};
void A::print()const
{
cout<<"call A print"<<endl;
}
class B:public A
{
public:
void print();
};
void B::print()
{
cout<<"call B print"<<endl;
}
int main()
{
B obj;
obj.print();
A *p=&obj;
p->print();
return 0;
}

结果是:call B print

                call A print

通过这几个代码的实践,让我对继承机制的实现有更深入的理解了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐