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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
参考技术A 编译默认会生成
Son::Son():Father()

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

你可以手写
Son::Son():Father(10/*你想要传递的值*/)

std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
本回答被提问者和网友采纳
参考技术B Son a(4.4,3):Father(给个确定的值); 用初始化列表 来初始化

子类有参构造函数调用基类有参构造函数(c++常问问题四)

利用类的初始化列表来调用就可以了,看下面代码

 

class base
{
public:
    base();
    base(int n);
};

class node : public base
{
    node();
    node(int n):base(n)
    {
        //...
    }
};

 

以上是关于C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量的主要内容,如果未能解决你的问题,请参考以下文章

C++中,建立子类对象的时候,会调用基类的构造函数,

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

子类有参构造函数调用基类有参构造函数(c++常问问题四)

C#在自己的构造函数之后调用基类的构造函数?

如何在 C++ 中调用基类的参数化构造函数?

从子类的构造函数体中调用基类的构造函数