C++中派生类的构造函数怎么显式调用基类构造函数?
2012-05-30
展开全部
子类构造的时候会自动调用基类的构造函数 并且是有顺序的
调用完构造函数的顺序 :基类 子类 子子类 ...
不仅构造函数 析构函数也这样 子类对象析构时自动调用基类的析构函数
顺序与构造函数顺序相反 :子类...基类
关于显示调用基类的构造函数,是不可行的。必须用初始化表的形式调用基类构造函数,才能正确的把子类继承下来的父类的成员初始化了。如果在子类构造函数体内显式调用了基类构造函数的话,那么该构造函数就会对一个在子类构造函数内存空间内的一个临时对象进行了初始化,因为没有取得正确的对象(子类对象)的指针。所以构造了半天白费。等子类构造函数退出,则统统丢失。所以,基类构造函数在没拿到正确this指针的情况下,没有办法正确赋值。下面是例子:
#include <iostream>
#include<string>
using namespace std;
class CLSA{
public:
CLSA( )
{}
CLSA( int i ) : m_j(i) {}
int getA()
{return m_j;}
private:
int m_j;
};
class CLS: public CLSA
{
public:
CLS( int i,int j );
/*CLS()
{
CLS(0);
}*/
int m_i;
};
CLS::CLS( int i,int j ) : m_i(i) ,CLSA(j)
{
CLSA(10);//这里显式调用基类构造函数给临时对象进行赋值的,但是等CLS构造函数退出返回后,临时对象丢失。所以, 这个函数没有给真正的对象赋值。因为没有取得正确的this地址。
}
int main()
{
CLS obj(2,3);
cout << obj.m_i << endl; //输出结果是什么?CLSA(j),
cout<<obj.getA();
return 0;
}
调用完构造函数的顺序 :基类 子类 子子类 ...
不仅构造函数 析构函数也这样 子类对象析构时自动调用基类的析构函数
顺序与构造函数顺序相反 :子类...基类
关于显示调用基类的构造函数,是不可行的。必须用初始化表的形式调用基类构造函数,才能正确的把子类继承下来的父类的成员初始化了。如果在子类构造函数体内显式调用了基类构造函数的话,那么该构造函数就会对一个在子类构造函数内存空间内的一个临时对象进行了初始化,因为没有取得正确的对象(子类对象)的指针。所以构造了半天白费。等子类构造函数退出,则统统丢失。所以,基类构造函数在没拿到正确this指针的情况下,没有办法正确赋值。下面是例子:
#include <iostream>
#include<string>
using namespace std;
class CLSA{
public:
CLSA( )
{}
CLSA( int i ) : m_j(i) {}
int getA()
{return m_j;}
private:
int m_j;
};
class CLS: public CLSA
{
public:
CLS( int i,int j );
/*CLS()
{
CLS(0);
}*/
int m_i;
};
CLS::CLS( int i,int j ) : m_i(i) ,CLSA(j)
{
CLSA(10);//这里显式调用基类构造函数给临时对象进行赋值的,但是等CLS构造函数退出返回后,临时对象丢失。所以, 这个函数没有给真正的对象赋值。因为没有取得正确的this地址。
}
int main()
{
CLS obj(2,3);
cout << obj.m_i << endl; //输出结果是什么?CLSA(j),
cout<<obj.getA();
return 0;
}
2012-05-30
展开全部
#include<iostream>
using namespace std;
class Base
{
public:
Base(int a):
a(a)
{
}
protected:
int a;
};
class A:public Base
{
public:
A(int a,int b):
Base(a),b(b)
{
}
void disp()
{
cout<<a<<" "<<b<<endl;
}
private:
int b;
};
void main()
{
A a(3,5);
a.disp();
return;
}
using namespace std;
class Base
{
public:
Base(int a):
a(a)
{
}
protected:
int a;
};
class A:public Base
{
public:
A(int a,int b):
Base(a),b(b)
{
}
void disp()
{
cout<<a<<" "<<b<<endl;
}
private:
int b;
};
void main()
{
A a(3,5);
a.disp();
return;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询