关于多态

caicaijuaner 2008-11-12 02:07:26
#include <iostream.h>
#include <string.h>
class B
{
public:
virtual void print()
{
cout <<" ....Bprint..."<<endl;
}
};

class P1:public B
{
public:
void print()
{
cout<<"...P1print..."<<endl;
}
};

class P2:public B
{
public:
void print()
{
cout<<"....P2print..."<<endl;
}
};

int main()
{

B a;
P1 b;
P2 c;
a.print();
a=b;
a.print();
a=c;
a.print();
return 1;
}
输出为
...Bprint....
...Bprint....
...Bprint....

为什么实现不了多态呢?
-----------------------
如果把main函数中的内容改为

B *a=new B;
P1 b;
p2 c;
a->print();
a=&b;
a->print();
a=&c;
a->print();

输出就为
...Bprint....
...P1print....
...P2print....

还有在上面为什么要B *a=new B;
直接B *a会报错:segmentation fault
如果print不是虚函数,就没有这个错误
这是为什么呢
我用的g++



...全文
94 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
caicaijuaner 2008-11-14
  • 打赏
  • 举报
回复
谢谢lann64
讲的太好了
我还以为是系统先给a分配空间
然后给指针分配空间
然后指针指向a


谢谢大家
lann64 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 caicaijuaner 的回复:]
lann64:
定义对象时,不是就分配空间了吗?
[/Quote]
是呀,定义对象时,是为对象分配空间。象B a这样,为a分配了空间。可你只定义了B *a,这是定义了一个指向B类型的指针a,为a分配了空间,可它指向哪?它指向的目标还没定义呢,怎么会分配空间?new就是为这个目标分配空间了。
liumingrong 2008-11-12
  • 打赏
  • 举报
回复
顶lann64
B *a只是定义了一个指针,并且是一个“野指针”
caicaijuaner 2008-11-12
  • 打赏
  • 举报
回复
lann64:
定义对象时,不是就分配空间了吗?
lann64 2008-11-12
  • 打赏
  • 举报
回复
还有在上面为什么要B *a=new B;
直接B *a会报错:segmentation fault
如果print不是虚函数,就没有这个错误
------------------------
B *a 只是定义了一个指针,它指向的对象在哪呢?你没有确定它指向哪,就使用a这个指针a->print(),系统到a这个地址去找虚函数表,没找到,报错(或者a里根本就是一个指向不可访问内存的地址,报错)。因为你没有给a赋值,a里的内容是原来内存中残留的垃圾,把它当地址,是未定义行为。

如果print不是虚函数时,你这里有点特殊。由于你的类里没有数据,而且print函数也没做任何类内的访问。这样编译器实际上只是传递了函数的入口地址。由于成员函数是公用的,并不保存在类对象内部,实际上也就不需要真正对那个a指向地址做访问了(既没数据,又没参数),直接调用了print函数,所以可以通过。但这样其实是错的,有很大隐患。
luxiaping 2008-11-12
  • 打赏
  • 举报
回复
是不是因为虚函数要一个虚函数指针指向虚函数表,所以声明时就要分配好空间。
lann64 2008-11-12
  • 打赏
  • 举报
回复
只有通过指针 或者 引用,才能实现多台。
wuyu637 2008-11-12
  • 打赏
  • 举报
回复
C++属于静态类型的OO语言,它通过指针或引用才能实现多态.

1. 首先要有继承关系;
2. 要正确地定义虚函数,包括函数名,参数和返回值必须完全相同;
3. 要用基类的指针或引用去调用派生类对象。
elephont9527 2008-11-12
  • 打赏
  • 举报
回复
使用对象无法实现多态,会产生切片
使用对象指针或者引用才可以实现多态
wuyu637 2008-11-12
  • 打赏
  • 举报
回复
多态的用法不对。请用指针或者引用

65,210

社区成员

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

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