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 展开
下面是我的一个例子:
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 展开
3个回答
展开全部
// 我把你的代码做了些修改
#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;
}
#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;
}
展开全部
编译默认会生成
Son::Son():Father()
{
std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
}
你可以手写
Son::Son():Father(10/*你想要传递的值*/)
{
std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
}
Son::Son():Father()
{
std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
}
你可以手写
Son::Son():Father(10/*你想要传递的值*/)
{
std::cout<<"子类默认构造函数被调用"<<std::endl;
m_son=0;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Son a(4.4,3):Father(给个确定的值); 用初始化列表 来初始化
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询