C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

子类继承了基类的一些变量,但问题是应该怎样初始化它们?我想在子类的构造函数中调用基类构造函数初始化它们,但是发现每次子类构造函数被调用前,就会调用基类的默认构造函数。但是我想用基类的其他构造函数来初始化继承的基类变量,该怎么办呀,难道非要在抄一遍基类的构造函数代码到子类构造函数中吗?

下面是我的一个例子:
MyClass.h中是这样的:
#pragma once

#include <iostream>

class Father
{
protected:
int m_father;
public:
Father();
Father(int n);
int GetInt(){return m_father;} //获得m_father
};

class Son: public Father
{
private:
double m_son;
public:
Son();
Son(double x,int n);
double GetDouble(){return m_son;} //获得m_son
};

MyClass.cpp中是这样的:
#include "MyClass.h"

Father::Father()
{
std::cout<<"基类默认构造函数被调用"<<std::endl;
m_father=0;
}

Father::Father(int n)
{
std::cout<<"基类int形参构造函数被调用"<<std::endl;
m_father=n;
}

Son::Son()
{
std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
}

Son::Son(double x,int n)
{
std::cout<<"子类int形参构造函数被调用"<<std::endl;
m_son=x;
Father::Father(n);//测试发现,这句话好像只是建立了一个临时的
//基类对象,子类构造函数返回后什么都没有发生
}

Main.cpp是这样的:
#include "MyClass.h"

int main()
{
Son a(4.4,3);
std::cout<<"子类中继承的基类变量m_father为:"<<a.GetInt()<<std::endl;
std::cout<<"子类中量m_son为:"<<a.GetDouble()<<std::endl;
}

结果是:
基类默认构造函数被调用
子类int形参构造函数被调用
基类int形参构造函数被调用
子类中继承的基类变量m_father为:0
子类中量m_son为:4.4

// 我把你的代码做了些修改

#include <iostream>

class Father
{
protected:
int m_father;
public:
Father();
Father(int n);
int GetInt(){return m_father;} //获得m_father
};

class Son: public Father
{
private:
double m_son;
public:
Son();
Son(double x,int n);
double GetDouble(){return m_son;} //获得m_son
};

Father::Father()
{
std::cout<<"基类默认构造函数被调用"<<std::endl;
m_father=0;
}

Father::Father(int n)
{
std::cout<<"基类int形参构造函数被调用"<<std::endl;
m_father=n;
}

Son::Son()
{
std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
}

Son::Son(double x,int n):Father(n) // 这样写
{
std::cout<<"子类int形参构造函数被调用"<<std::endl;
m_son=x;
// Father::Father(n);//测试发现,这句话好像只是建立了一个临时的
//基类对象,子类构造函数返回后什么都没有发生
}

int main()
{
Son a(4.4,3);
std::cout<<"子类中继承的基类变量m_father为:"<<a.GetInt()<<std::endl;
std::cout<<"子类中量m_son为:"<<a.GetDouble()<<std::endl;
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-01
编译默认会生成
Son::Son():Father()
{
std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
}
你可以手写
Son::Son():Father(10/*你想要传递的值*/)
{
std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
}本回答被提问者和网友采纳
第2个回答  2013-08-10
Son a(4.4,3):Father(给个确定的值); 用初始化列表 来初始化

...能否在子类构造函数初始化列表里调用基类构造函数?
public:B(int x,int y,int z):A(x,y),z(z){} \/\/子类构造函数初始化列表必须给出基类所需参数 };

C++中派生类的构造函数怎么显式调用基类构造函数?
关于显示调用基类的构造函数,是不可行的。必须用初始化表的形式调用基类构造函数,才能正确的把子类继承下来的父类的成员初始化了。如果在子类构造函数体内显式调用了基类构造函数的话,那么该构造函数就会对一个在子类构造函数内存空间内的一个临时对象进行了初始化,因为没有取得正确的对象(子类对象)的...

在c++中为什么基类不缺省构造时候派生类要调用基类构造函数进行初始化...
首先,C++本身就规定创建子类对象的时,先调用基类的构造函数,然后再调用自己类的构造函数。当我们的基类没有自己定义构造函数时候(就是系统默认的构造函数)时。创建子类对象会先默认调用基类的默认构造函数。但是,当我们的基类自己定义了构造函数,(可能定义了很多个)此时不会再自动生产默认构造。但是...

...的基类成员初始化的工作也要由派生类的构造函数承担?
在子类构造对象时,首先要调用基类的构造函数,再调用子类的构造函数;子类对继承来的变量:1.初始化:那么可想而知,最终构造子类对象时子类对这个变量的初始化起了作用(因为先基类构造函数对其初始化,后子类构造函数对其初始化,明白吧);2.不初始化:那么可想而知,子类不干初始化这变量的事了,...

C++语言构造函数继承问题
子类的构造函数1)隐式构造基类子对象2)显示构造基类子对象3)构造顺序:首先按照继承表的顺序,依次调用各个基类的构造函数,初始化子类对象中的基类子对象;其次按照声明的顺序,依次调用各个类类型成员变量相应类型的构造函数,初始化子类对象中的成员子对象;最后执行子对象构造函数中的代码。所有的子对象...

派生类对象的创建过程中基类部分是如何进行初始化 详细??
1 : 由于派生类对象中的基类对象部分是在派生类对象创建时首先被构造的,因此基类对象的数据成员的创建和初始化是先于派生类新增属性的创建和初始化的。如果基类对象的构造需要传递参数对它的数据成员进行初始化,则需要在派生类构造函数定义的初始化表中调用基类的构造函数,并将由派生类构造函数的参数表...

C++ 类中的类成员变量怎么调用带参数的构造函数来初始化?
B(int b) : bx(b) \/\/这样调用 { } B() : bx(0) \/\/这样也行 { } \/***\/ void print(){ printf("%d", bx.ax);} \/***\/ A bx; \/\/这样声明 \/***\/ };int main(int argc, char* argv[]){ \/***\/ B b; \/\/使用B的默认构造函数 B bb(10); \/\/使用B的...

c++ 中,在基类中有一个 数组,应该怎么用构造函数进行初始化呢?
class A { public:A(int x = 0);private:int a[4];};A::A(int x){ for (int i = 0;i < 4;i++)a[i] = x;} 派生类构造函数:B::B(int x):A(x){ ...}

C++的基类和派生类构造函数
基类与派生类的构造函数在C++中有所不同,基类的成员函数可以被继承,但构造函数不能。构造函数是为了初始化派生类的成员变量,但在基类中有private属性的成员变量在派生类中无法访问。因此,派生类的构造函数需要调用基类的构造函数来完成初始化工作。以下是一个示例,展示如何在派生类构造函数中调用基类...

C++ 类的问题 基类成员函数可以调用子类的成员函数吗?
实际上指向的东西是未知的,有些编译器会提醒,但有些编译器可以编译通过。试试在abc里进行new然后输出,应该是可以的。忠告:不要在基类构造函数中使用任何本类的虚函数,因为构造函数在虚函数表的构建之前,所以执行结果是未知的,基类可能会也可能并不会 如你预期的那样调用子类重载的虚函数,...

相似回答