📄 subject_27735.htm
字号:
<p>
序号:27735 发表者:loverain 发表日期:2003-01-14 19:19:01
<br>主题:不好意思,问题如下:谢谢以上各位的热心帮忙!麻烦再看一下!!
<br>内容:class father<BR>{<BR> static father * CreateObj();<BR>};<BR>class son : public father<BR>{<BR>public:<BR> int *handle;<BR>};<BR>son::son()<BR>{handle = new int;}为什么如此father * father::CreateObj()<BR> { father *p = new son;<BR> return p;<BR><BR> }<BR>这样总是不对??总是在执行时提示:warn-> base class not iniatialized<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:tjhe 回复日期:2003-01-14 21:16:34
<br>内容:如下代码,没有你的错误提示,怎么回事?<BR><BR>#include <iostream.h><BR>class father<BR>{<BR>public:<BR> static father * CreateObj();<BR>};<BR><BR>class son : public father<BR>{<BR>public:<BR> son() {handle = new int;};<BR> ~son() {delete handle;};<BR>//protected:<BR> int *handle;<BR>};<BR>father * father::CreateObj()<BR>{ <BR> father *p = new son;<BR> return p;<BR>}<BR><BR>void main()<BR>{<BR> father* p = father::CreateObj();<BR> cout << ((son*)p)->handle;<BR> delete p;<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:golden wings 回复日期:2003-01-14 21:23:16
<br>内容:这是编译器在警告你,<BR>当你在 father *p = new son; 时<BR>p所指的son的实例中包含一个father类的实例(father是son的基类),因为你没有提供father类的构造函数,编译器虽然会给你生成一个,但它什么也不做,因此你的father类的成员变量会无法初始化(如果有的话,当然你这没有),它们的取值是不确定的,编译器希望引起你的注意。<BR>"base class not iniatialized"的意思是“基类没有初始化”,它只是一个警告,不是错误。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:在水一方 回复日期:2003-01-14 21:31:50
<br>内容:你在class son的声明中掉了其构造函数的声明<BR> son();<BR>俺在VC6.0中如下通过:<BR><BR>#include <iostream.h><BR><BR>class CFather<BR>{<BR> public:<BR> int value;<BR> static CFather *CreateObject();<BR>};<BR><BR>class CSon : public CFather<BR>{<BR> public:<BR> int *m_p;<BR> CSon();<BR> ~CSon();<BR>};<BR><BR>CFather *CFather::CreateObject()<BR>{<BR> return (new CSon);<BR>}<BR><BR>CSon::CSon()<BR>{<BR> m_p = new int;<BR>}<BR><BR><BR>CSon::~CSon()<BR>{<BR> delete m_p;<BR>}<BR><BR><BR><BR>int main(int argc, char* argv[])<BR>{<BR> CFather *p;<BR> p = CFather::CreateObject();<BR> p->value = 355;<BR> cout<<p->value<<endl;<BR> delete p;<BR> return 0;<BR>}<BR><BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:芝麻不开门 回复日期:2003-01-15 23:27:19
<br>内容:楼上的大虾,关于p俺有个问题:<BR>在你的main函数中,p是作为CFather类型的指针定义的。可运行p=CFather::CreateObject()之后返回的是CSon类型的指针,p就应该指向一个CSon对象。这样的话就应该有p->m_p这个数据成员。<BR>可事实并非如此,p指向的对象始终只有一个数据成员value,也就是说p并没有被转成CSon指针。你能解释一下吗??
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IceAge 回复日期:2003-01-16 00:27:41
<br>内容:尽管 (new CSon), CFather::CreateObject()之后返回的是CFather, 而不是CSon, 因为:<BR> -------- CFather * -------- CFather::CreateObject()<BR><BR>你可以这样:<BR><BR> CSon* p = (CSon*) CFather::CreateObject(); --- 告诉编译器你知道这是CSon*
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -