请教个C++多态性的问题,谢谢了

ymy1248227142 2013-05-01 05:23:02
代码如下:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
class base {
public:
virtual void print() {
cout<<"it is in base::print"<<endl;
}
virtual ~base(){}
};
class son:public base {
public:
virtual void print() {
cout<<"it is in son::print"<<endl;
}
virtual ~son(){}
};
class grandson:public son {
public:
virtual void print() {
cout<<"it is in grandson::print"<<endl;
}
virtual ~grandson(){}
};
void fun(base arge) {
arge.print();
}
int main() {
base a;
son b;
grandson c;
fun(a);
fun(b);
fun(c);
return 0;
}
问题1:main函数里的fun(a),fun(b),fun(c)为什么全部输出it is in base::print,这里没有多态?
问题2:为什么将fun函数定义成void fun(base &arge) { arge.print(); } 后,主函数fun(a),fun(b),fun(c)输出的就分别是
it is in base::print
it is in son::print
it is in grandson::print
了呢?这里又有多态了。。。
...全文
186 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
有新工作否 2013-05-02
  • 打赏
  • 举报
回复
貌似大家都没有对问题回答清楚。 问题1,fun函数的形参是base对象,用son对象和grandson对象给base对象赋值的时候,会把son对象和grandson对象的base对象部分切出来,赋值给形参。这时候实参是一个base对象,只不过值是由son对象和grandson对象的base部分赋值的。这里面暗中新构建了一个base对象,所以不管怎么实现,肯定是base对象的函数体。 问题2,这就是明显的多态性了,引用本身就是一个指向自身的指针,所以问题都是指针的问题。base对象的指针指向son对象或者grandson对象的base部分,但是本质还是son对象或者grandson对象,所以实现的时候,具体就看对象的type.而实现具体的函数体。这就像你给一个变量的指针或者引用作为函数形参,就修改了这个变量本身。 这里面有个重要概念,在每个对象的虚函数表中,都记录着本身对象的信息,给虚函数来判断具体实现哪种函数体。 再想具体,请看 深入探讨C++模型
hugett 2013-05-01
  • 打赏
  • 举报
回复
只有基类指针跟引用才有多态。。基类对象是没有多态的。。
沙尘暗影 2013-05-01
  • 打赏
  • 举报
回复
指针和引用会触发多态
就是那个党伟 2013-05-01
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

class base {
public:
	virtual void print() {
		cout<<"it is in base::print"<<endl;
	}
	virtual ~base(){}
};

class son:public base {
public:
	virtual void print() {
		cout<<"it is in son::print"<<endl;
	}
	virtual ~son(){}
};

class grandson:public son {
public:
	virtual void print() {
		cout<<"it is in grandson::print"<<endl;
	}
	virtual ~grandson(){}
};

void fun(base arge) { //基类对print()的调用
	arge.print();
}
void func(base& arge) { //静态多态
	arge.print();
}

void func_t(base* arge){ //动态多态
	arge->print();
}

int main() {
	base a;
	son b;
	grandson c;
	func_t(&a);
	func_t(&b);
	func_t(&c);

	base d;
	son e;
	grandson f;
	func(d); 
	func(e);
	func(f);

	return 0;
}
可以参考这里,对多态以及虚函数表的一些观点 http://wenku.baidu.com/view/cf0de18da0116c175f0e48d2.html
quickSort 2013-05-01
  • 打赏
  • 举报
回复
要实现多态(动态绑定),必须满足以下之一 1、使用指针调用 2、使用引用调用 将fun函数定义成void fun(base &arge) { arge.print(); } 后,这里所引用,从而实现多态。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧