C++ 类的问题 基类成员函数可以调用子类的成员函数吗?
我在父类中声明子类的指针然后再父类的构造函数中定义这个指针m_pSon=newCson();然后再父类的成员函数abc()中调用这个子类指针abc(){m_pSon->d...
我在父类中声明子类的指针 然后再父类的构造函数中定义这个指针 m_pSon=new Cson();
然后再父类的 成员函数 abc()中调用这个子类指针
abc()
{ m_pSon->dfg();//子类成员 函数 里面就是 cout<<"子类"<<endl;
}
编译没问题 但是运行的话 根本没有输出 如果将子类变成普通类 就可以
这是为什么呢 本人初学C++ 请大哥指点下 展开
然后再父类的 成员函数 abc()中调用这个子类指针
abc()
{ m_pSon->dfg();//子类成员 函数 里面就是 cout<<"子类"<<endl;
}
编译没问题 但是运行的话 根本没有输出 如果将子类变成普通类 就可以
这是为什么呢 本人初学C++ 请大哥指点下 展开
3个回答
展开全部
父类--子类 这种关系,本来设计就是把 具备共性的东西放在父类里, 不具备共性的放在子类里.
严格来说,父类是不能去调用某个子类特有的接口的.
你这样瞎搞 就破坏了这种构架,只能让程序紊乱.
所以你可以这样子:
在父类立面设计一个通用接口,然后对这个通用接口下指令, 子类收到这个消息,大多不处理, 只有那个特殊的子类才处理这个事件.
严格来说,父类是不能去调用某个子类特有的接口的.
你这样瞎搞 就破坏了这种构架,只能让程序紊乱.
所以你可以这样子:
在父类立面设计一个通用接口,然后对这个通用接口下指令, 子类收到这个消息,大多不处理, 只有那个特殊的子类才处理这个事件.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在父类的构造函数里写下如下代码
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++ 环境,有时需要这个语句,以便看到运行结果
}
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++ 环境,有时需要这个语句,以便看到运行结果
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询