c++类的问题

jdbc945 2010-04-15 11:05:25
遇到此情况

class2是继承class1的

代码: class1 c = new class2;

那对象c的类到底是class1还是class2,这样做有何意图

typeid(c)又等于class1 还是class2 请解释 谢谢
...全文
234 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang7890 2010-04-18
  • 打赏
  • 举报
回复
顶 6 楼,很生动
品茶 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jdbc945 的回复:]
我就是想不通,他为啥偏要是class1 *c 他和class2 *c有啥区别呢
[/Quote]

class1 *c//这里的c是基类指针,可以指向所有子类对象
class2 *c//这里的c只能指向class2类,不能指向基类和其他子类对象。

这样做的好处:
只需要定义一个指针

需要注意的地方:
基类的析构函数必须写成虚函数,这样才会调用子类的析构函数释放new出来的子类对象。
ForestDB 2010-04-17
  • 打赏
  • 举报
回复
那个上厕所的挺好。
zhenhua0831 2010-04-17
  • 打赏
  • 举报
回复
呵呵,六楼的太你比了,学习学习……
starcat 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jdbc945 的回复:]

如果class2多了一些成员,c里面会有么?
[/Quote]楼主百度Object slicing
jdbc945 2010-04-16
  • 打赏
  • 举报
回复
我就是想不通,他为啥偏要是class1 *c 他和class2 *c有啥区别呢
jdbc945 2010-04-16
  • 打赏
  • 举报
回复
如果class2多了一些成员,c里面会有么?
sld009 2010-04-16
  • 打赏
  • 举报
回复
多态用于lz妈妈喊lz吃饭:
假设只要是人都会吃饭,人为抽象类,lz继承于人
妈妈叫你吃饭的时候只需要说“大家都吃饭”,而不用说“lz吃饭,1吃饭,2吃饭,3吃饭”

简而言之,多态即不同对象(lz,1,2,3)的同一行为(吃饭)

seraph89 2010-04-16
  • 打赏
  • 举报
回复
6楼 学习了!
decoupling 2010-04-16
  • 打赏
  • 举报
回复
这是多态..你写一些程序自然会明白 如果不写写东西 确实很难弄清楚为什么程序要那么写..解释起来你也很难理解..

FingerStyle 2010-04-16
  • 打赏
  • 举报
回复
java转C++ ? o o.
crysnower__ 2010-04-16
  • 打赏
  • 举报
回复
基类定义虚函数是为了 在子类中多态化
「已注销」 2010-04-16
  • 打赏
  • 举报
回复
6楼解释的很形象-_-
oyjian 2010-04-16
  • 打赏
  • 举报
回复
搞错了,
fun(d1);
fun(d2);
应该修改为
fun(&d1);
fun(&d2);
oyjian 2010-04-16
  • 打赏
  • 举报
回复
C++的多态是通过虚函数来实现的,如果基类没有虚函数,那么就没有存在多态的问题了。
例如:
class CBase
{virtual void fBase(){cout << "CBase::fBase()";}
};
class CD1:public CBase
{void fBase(){cout << "CD1::fBase()";}
};
class CD2:public CBase
{void fBase(){cout << "CD2::fBase()";}
};

void fun(CBase*p)
{p->fBase();}
CD1 d1;
CD2 d2;
fun(d1);
fun(d2);
如果CBase::fBase()前面有virtual则输出结果为:

CD1::fBase()
CD2::fBase()
这时候是多态。
否则,输出结果为:
CBase::fBase()
CBase::fBase()

sallan 2010-04-16
  • 打赏
  • 举报
回复
6楼说的话糙理不糙,很容易懂
elegant87 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jdbc945 的回复:]

如果class2多了一些成员,c里面会有么?
[/Quote]
不会有的。C++这样做是为了实现多肽,通过基类对象指针来访问派生类的继承的虚拟成员
wang7890 2010-04-16
  • 打赏
  • 举报
回复
6楼很形象
herman~~ 2010-04-16
  • 打赏
  • 举报
回复
new后面的参数告诉编译器,你想构造的是哪个对象,至于你想把返回的指针赋值给什么类型就由你决定,但是里面的内存结构就是你new出来的对象的
howlet2 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 howlet2 的回复:]
class1* c = new class2;
这样作只是得到了新建的一个类的地址,没什么别的意图。
[/Quote]
这样作只是得到了新建的一个对象的地址,没什么别的意图
加载更多回复(14)

65,210

社区成员

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

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