C++ 类的问题 基类成员函数可以调用子类的成员函数吗?

我在父类中声明子类的指针然后再父类的构造函数中定义这个指针m_pSon=newCson();然后再父类的成员函数abc()中调用这个子类指针abc(){m_pSon->d... 我在父类中声明子类的指针 然后再父类的构造函数中定义这个指针 m_pSon=new Cson();
然后再父类的 成员函数 abc()中调用这个子类指针
abc()
{ m_pSon->dfg();//子类成员 函数 里面就是 cout<<"子类"<<endl;
}
编译没问题 但是运行的话 根本没有输出 如果将子类变成普通类 就可以
这是为什么呢 本人初学C++ 请大哥指点下
展开
 我来答
402407
2012-12-18 · TA获得超过771个赞
知道小有建树答主
回答量:726
采纳率:50%
帮助的人:908万
展开全部
不要在父类的构造函数中定义这个指针。
因为父类的构造函数是在子类的构造函数之前,所以如果在父类构造函数中定义的这个指针,实际上指向的东西是未知的,有些编译器会提醒,但有些编译器可以编译通过。
试试在abc里进行new然后输出,应该是可以的。
忠告:不要在基类构造函数中使用任何本类的虚函数,因为构造函数在虚函数表的构建之前,所以执行结果是未知的,基类可能会也可能并不会 如你预期的那样调用子类重载的虚函数,
archmageee4
2017-07-05 · TA获得超过1516个赞
知道大有可为答主
回答量:1581
采纳率:78%
帮助的人:926万
展开全部
父类--子类 这种关系,本来设计就是把 具备共性的东西放在父类里, 不具备共性的放在子类里.

严格来说,父类是不能去调用某个子类特有的接口的.
你这样瞎搞 就破坏了这种构架,只能让程序紊乱.
所以你可以这样子:
在父类立面设计一个通用接口,然后对这个通用接口下指令, 子类收到这个消息,大多不处理, 只有那个特殊的子类才处理这个事件.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_whales
推荐于2017-07-05 · TA获得超过2279个赞
知道大有可为答主
回答量:1814
采纳率:85%
帮助的人:506万
展开全部
在父类的构造函数里写下如下代码
m_pSon=new Cson();
因为Cson();
是子类的构造函数,它会自动调用,父类的构造函数,这样会形成递归调用。由于没有终止递归的条件,形成无限递归,最终会出现堆栈溢出错误。并且构造失败。在程序里只有m_pSon=new Cson();在无限执行直至出错。下边的语句永远得不到执行。
如果将子类变成普通类,则仅仅是分配空间,的new 操作,new执行时执行构造函数Cson();是一个正常的函数调用显然没有问题。
真的要用类似的方式的话,学一学设计模式吧;找两本C++ 应用方面的书看一看,

事实上,通常这样做,这是在一个有名的C++书籍里看到的,书名没记住。有些地方可能多余了。先这样吧!好像是关于虚拟构造函数的,所谓“信封信纸模式”之类的。

class CParent
{
protected:
int nID;
CParent *m_pParent;
public:
CParent():nID(0),m_pParent(NULL)
{ //cout<<"CParent() "<<endl;
};

static CParent* CreateObj(int nID=0);

void abc(){if(m_pParent)m_pParent->dfg();//子类成员 函数 里面就是 cout<<"子类"<<endl;
};
virtual void dfg(){cout<<"父类"<<endl;}
virtual ~CParent()
{ // cout<<"~CParent() Start"<<endl;
if(m_pParent)delete m_pParent;
m_pParent=NULL;
//cout<<"~CParent() End"<<endl;
};
};
class CSon:public CParent
{
int x,y;
public:
CSon():x(0),y(0){
nID=1;
cout<<"CSon() "<<endl;

};

virtual ~CSon(){

//cout<<"~CSon() Start"<<endl;
if(m_pParent)delete m_pParent;
m_pParent=NULL;
//cout<<"~CSon() End"<<endl;

};
virtual void dfg(){//子类成员 函数 里面就是 cout<<"子类"<<endl;
cout<<"子类CSon::dfg()"<<endl;
};

};
CParent *CParent::CreateObj(int nID)
{
CParent *p=new CParent();//信封
switch(nID)
{
case 0:
// cout<<"Start Create Parent "<<endl;
p->m_pParent=new CParent(); //内容为父类型
// cout<<"End Create Parent "<<endl;
break;
case 1:
// cout<<"Start Create Son "<<endl;
p->m_pParent=new CSon();//内容为子类型
//cout<<"End Create Son "<<endl;
break;
}
p->nID=nID;
return p;
};

void main()
{
{
CParent *p=CParent::CreateObj(1);
p->abc();
delete p;

}
while(cin.get()!='Q');//VC++ 环境,有时需要这个语句,以便看到运行结果
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式