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

这种问题首先得清楚调用的是哪一个版本的函数!!然后就可以知道该函数所在的作用域

 

 代码一:

#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

通过这几个代码的实践,让我对继承机制的实现有更深入的理解了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值