C++中派生类的构造函数怎么显式调用基类构造函数?

如题所述

子类构造的时候会自动调用基类的构造函数 并且是有顺序的
调用完构造函数的顺序 :基类 子类 子子类 ...

不仅构造函数 析构函数也这样 子类对象析构时自动调用基类的析构函数
顺序与构造函数顺序相反 :子类...基类

关于显示调用基类的构造函数,是不可行的。必须用初始化表的形式调用基类构造函数,才能正确的把子类继承下来的父类的成员初始化了。如果在子类构造函数体内显式调用了基类构造函数的话,那么该构造函数就会对一个在子类构造函数内存空间内的一个临时对象进行了初始化,因为没有取得正确的对象(子类对象)的指针。所以构造了半天白费。等子类构造函数退出,则统统丢失。所以,基类构造函数在没拿到正确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;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  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;
}

C++中派生类的构造函数怎么显式调用基类构造函数?
CLSA(10);\/\/这里显式调用基类构造函数给临时对象进行赋值的,但是等CLS构造函数退出返回后,临时对象丢失。所以, 这个函数没有给真正的对象赋值。因为没有取得正确的this地址。} int main(){ CLS obj(2,3);cout << obj.m_i << endl; \/\/输出结果是什么?CLSA(j),cout<<obj.getA();return ...

C++的基类和派生类构造函数
因此,只能将基类构造函数的调用放在函数头部,不能放在函数体中。此外,函数头部是对基类构造函数的调用,而不是声明,所以括号里的参数是实参,既可以是派生类构造函数参数列表中的参数,也可以是局部变量、常量等,例如:构造函数调用顺序 在C++继承中,创建派生类对象时会优先调用基类构造函数,然后是派...

...基类不缺省构造时候派生类要调用基类构造函数进行初始化
one():x(3){cout<<"调用基类无参数构造函数"} \/\/没有参数的构造函数 one(int a,int b):x(a),y(b){cout<<"调用基类两个参数的构造函数"} };class two:public one { public:two():one(){} \/\/因为基类已经定义2个构造,所以应该指定调用哪个 void disp(){ cout<<"调用two的d...

C++问题 class clrcle {double r,s; public: circle(d
1、初始化基类,就是调用基类的构造函数。如果基类也是一个派生类,就会先初始化它的基类,以此类推,最先初始化的是最上层的基类 2、基类初始化完成后,就开始执行派生类的初始化了,也就是circle(x){}后面的{}(你的派生类的构造函数体没有执行任何东西)另外,你也可以这样。在派生类的构造函数...

C++创建派生类对象时,调用构造函数顺序
派生类构造函数中的某些初始化可能是基于基类的,所以规定构造在类层次的最根处开始,而在每一层,首先调用基类构造函数,然后调用成员对象构造函数。因为C++的成员变量是不会自动初始化的。如果没有显式调用基类的构造函数,会自动调用基类的无参构造函数。而如果基类只有带参数的构造函数,则会报错。不...

问下C++中派生类调用基类变量(public)怎么调用的?
这里你用的是继承 并且是用的public 所以是可以直接用其父类的public定义的量 即和x1中用的方法一样

派生类对象的创建过程中基类部分是如何进行初始化 详细??
如果基类对象的构造需要传递参数对它的数据成员进行初始化,则需要在派生类构造函数定义的初始化表中调用基类的构造函数,并将由派生类构造函数的参数表传递来的相应的参数作为实参传递给被调用的基类构造函数,用于对基类对象的初始化。例如: class point { int x, y; public: point(int x, int y)...

C++派生类的复制构造函数的初始化为什么用基类,而不是派生类对象 他的...
const Derived &d);则Derived类的复制构造函数的执行过程为:Derived(const Derived &d):Base(d)\/\/由于构造函数不能被继承,而且派生类不能直接访问基类的私有成员, 因此需要使用初始化列表来初始化基类的私有数据成员 { \/\/初始化Derived类声明中自己声明的数据成员 } ...

派生类的拷贝构造函数问题:派生类的引用初始化基类的引用
C::C(C &c1):B(c1){…} 这段代码定义了派生类的拷贝构造函数, 然后调用了基类的拷贝构造函数(c1被当做基类B的对象来使用)。include <iostream>class Base {public:Base() {std::cout << "Base()" << std::endl;}Base(const Base & other) {std::cout << "Base(const Base &)"...

...派生类构造函数初始化时,必须同时对基类构造函数初始化,怎么理解...
构造一个对象是从内向外构造的,也就是先构造基类,再构造派生类。因此必须在派生类构造函数执行前先执行基类构造函数。你的那个例子因为构造函数都是最简单的无参数类型,所以无所谓,不需要额外明白的写出来,C++会默认帮你调用无参数的base()。实际上完整的写法应该是这样的:class follow { public:fo...

相似回答