将派生类对象传递给基类指针的疑问

wonenggaoruanjianbu 2010-01-01 01:01:32

class a
{
public:
virtual void pintf(void)
{
cout<<"A:pintf"<<endl;
}
};
class b:public a
{
public:
virtual void pintf(void)
{
cout<<"B:pintf"<<endl;
}
};
class c:public a
{
public:
void pintf(void)
{
cout<<"C:pintf"<<endl;
}
};
void pintf(a a1)
{
a1.pintf();
}
int main()
{
a a1,*pa,*pb,*pc;
b b1;
c c1;

pa = &a1;
pb = &b1;
pc = &c1;

a1.pintf();
b1.pintf();
c1.pintf();

pa->pintf();
pb->pintf();
pc->pintf();

pintf(a1);//A:printf
pintf(b1);//A:printf 为什么不是B:printf
pintf(c1);//A:printf,为什么呢,不是C:printf
return 0;
}
...全文
53 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ImJaden 2010-01-01
  • 打赏
  • 举报
回复
我刚自学到这里,还没有接触到virtual关键字,还是有些不太明白。呵呵
dqdx_zch 2010-01-01
  • 打赏
  • 举报
回复
动态绑定只能发生在引用,或指针的情况下。
它是利用虚函数表来完成的。
如果学完了c++,可以看一下《深入浅出MFC》的c++部分,全章没几页,但各个是要害。
dqdx_zch 2010-01-01
  • 打赏
  • 举报
回复
这不是发生了动态绑定吗?
traceless 2010-01-01
  • 打赏
  • 举报
回复
使用了virtual关键字,这是告诉编译器应该调用方法所在的对象。

void pintf(a a1):这种情况就是所谓的浅拷贝。
void pintf(a &a1):这种情况就是所谓ideas深度拷贝。

我觉得还不如从“调用方法所在的对象”来思考。
1> 对于 形参为:a a1,也就是说a1所指的对象是a这个模型

2> a &a1:引用,引用的另一层含义也就是指针,形参a1接受的是传给它的子类模型的对象,
所以得到想要的

3> a *a1:指针,更好理解了,也是接受的是实参的模型的对象。

如果没有了virtual关键字,以上情况输出的都是"A:pintf"。
所以编译器在编译时可能是分了两步进行判断:
1:是否有 virtual关键字于基类;
2:判断参数类型
  • 打赏
  • 举报
回复
谢谢你的回复。
让我多学了一个知识。

void pintf(a &a1)//请使用引用
{
a1.pintf();
}
pintf(a1);//A:printf
pintf(b1);//A:printf 为什么得到A:print不是B:printf
pintf(c1);//A:printf,为什么呢,A:print不是C:printf




void pintf(a &a1)//请使用引用
{
a1.pintf();
}

pintf(a1);//A:printf
pintf(b1);//B:printf 为什么 呢
pintf(c1);//C:printf,为什么呢,

//想知道两种情况输出不同的原因,原因...
mstlq 2010-01-01
  • 打赏
  • 举报
回复
楼主想要的是这个吧?

class a
{
public:
virtual void pintf(void)
{
cout<<"A:pintf"<<endl;
}
};
class b:public a
{
public:
virtual void pintf(void)
{
cout<<"B:pintf"<<endl;
}
};
class c:public a
{
public:
void pintf(void)
{
cout<<"C:pintf"<<endl;
}
};
void pintf(a &a1)//请使用引用
{
a1.pintf();
}
int main()
{
a a1,*pa,*pb,*pc;
b b1;
c c1;

pa = &a1;
pb = &b1;
pc = &c1;

a1.pintf();
b1.pintf();
c1.pintf();

pa->pintf();
pb->pintf();
pc->pintf();

pintf(a1);//A:printf
pintf(b1);//A:printf 为什么不是B:printf
pintf(c1);//A:printf,为什么呢,不是C:printf
return 0;
}

64,282

社区成员

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

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