标题:虚函数的请教(我概念没理解透)
只看楼主
heliujin
Rank: 2
等 级:论坛游民
帖 子:249
专家分:14
注 册:2006-3-14
结帖率:100%
 问题点数:0 回复次数:3 
虚函数的请教(我概念没理解透)

程序如下:
#include<iostream.h>
#include<string.h>

class a
{
public:
a(){}

a(char *q)
{
p=new char[strlen(q)+1];
strcpy(p,q);
}

a(const a &other)
{
this->p=new char[strlen(other.p)+1];
strcpy(this->p,other.p);
}

~a()
{
delete p;
}

virtual void disp()
{
cout<<p<<endl;
}

private:
char *p;
};

class b:public a
{

public:
b(){}

b(char *m,char *n):a(m)
{
s=new char[strlen(n)+1];
strcpy(s,n);
}

b(const b &other)
{
s=new char[strlen(other.s)+1];
strcpy(s,other.s);
}

~b()
{
delete s;
}

void disp()
{
cout<<s<<endl;
}
private:
char *s;
};

int main()
{
a m("123");
b n("789","456");
a *p=&m;
p->disp();
p=&n;
p->disp();
return 0;
}

定义了m是123 再在n中初始化后 为什么没变成789啊
怎么才能变成789啊?
请大家把我问题的本质讲一讲吧 我对概念还不太理解
谢谢大家了

搜索更多相关主题的帖子: 函数 概念 char strcpy include 
2006-07-10 10:02
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
我昏,123是1个地址中存进的值,它是在类a中的。
你在定义一个b类n,那么会再分配一个内存,那么你说m中的值为什么会改变呢?
至于虚拟函数:我有这种见解,不知对否?如下:
你可以把基类看成一个小匣子,那么派生类就是一个大匣子:
_________ 看左边的图形A是基类,B是派生类
| | person *ptr=new customer;表示person的指针指向一个customer的对
| A | 象,可以看成:person的this地址与返回的customer是一个地方,只
————| <--B 不过,customer对象要在后面额外的加上派生而来的多余的特征。本
| | 来如果不用虚拟函数,那么这个指针就会调用A中的成员函数,因为这
| | 个地址作为起点的A盒子中有这个函数。然而有了虚拟函数,那么这个
————— 虚拟函数就会在一个虚表中,并且有一个虚拟指针指向这个虚表的首地址,调用这些函数时是通过这个虚拟指针来调用这些虚拟函数。当派生类重写这个函数时,它会对他继承的虚表做修改,那么在调用这个函数时,就会因为判断虚拟指针指向虚表的内容而决定使用哪一个函数~!

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-10 10:11
stylev
Rank: 1
等 级:新手上路
威 望:1
帖 子:136
专家分:0
注 册:2006-5-30
得分:0 

定义了m是123 再在n中初始化后 为什么没变成789啊
怎么才能变成789啊?

b(char *m,char *n):a(n)
{
s=new char[strlen(m)+1];
strcpy(s,m);
}

E-mail/MSN: stylev@
2006-07-12 12:46
虫虫飞ya飞
Rank: 1
等 级:新手上路
帖 子:122
专家分:0
注 册:2005-11-28
得分:0 

你看清楚你写的是strcpy(s,n)不是strcpy(s,m)把n换成m就可以了


2006-07-13 16:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-77488-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.718437 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved