1.继承过程中的构造函数

A:继承与派生过程中,基类的构造函数不能被继承,派生类中需要声明自己的构造函数。
B:声明构造函数时,只需要对本类中新增成员进行初始化。至于基类继承过来的成员,应该调用基类的构造函数来完成
C:需要强调的是,派生类的构造函数需要给基类的构造函数传递参数

1.1 单一继承时的构造函数

基本公式:
派生类名(基类所需要的形参,派生类成员所需的形参):基类名(参数表)
{
本类成员初始化赋值语句;
}
#include<iostream>
using namespace std;class B{
public:B();B(int i);~B();void Print() const;
private:int b;
};
B::B()
{   b=0;cout<<"B's default constructor called."<<endl;
}
B::B(int i)
{   b=i;cout<<"B's constructor called." <<endl;
}
B::~B()
{   cout<<"B's destructor called."<<endl;  }
void B::Print() const
{   cout<<b<<endl;  }class C:public B
{
public:C();C(int i,int j);~C();void Print() const;
private:int c;
};
C::C() //自动调用基类B的默认构造函数
{   c=0;
cout<<"C's default constructor called."<<endl;
}
C::C(int i,int j):B(i) //显式调用基类B的含有参数的构造函数
{   c=j;
cout<<"C's constructor called."<<endl;
}
C::~C()
{   cout<<"C's destructor called."<<endl; }
void C::Print() const
{   B::Print(); cout<<c<<endl;  }
void main()
{   C cc;C obj(5,6);    obj.Print();
}
运行结果:

1.2 多继承时的构造函数

基本公式:
派生类名(基类1形参,基类2形参,...,基类n形参,本类形参):基类名1(参数),基类名2(参数),...,基类名n(参数)
{
本类新增参数进行赋值;
}
#include <iostream>
using namespace std;class B1{
public: B1(int i) {cout<<"constructing B1 "<<i<<endl;}
};
class B2{
public:B2(int j) {cout<<"constructing B2 "<<j<<endl;}
};
class B3{
public:B3() {cout<<"constructing B3 *"<<endl;}
};
///
class C: public B1, public B2, public B3{
public:C(int a,int b, int c,int d):memobj1(c),B1(a),B2(b),memobj2(d) {}
private:B2 memobj2;B1 memobj1;B3 memobj3;
};
void main()
{C obj(1,2,3,4);
}

运行结果:

1.3 派生类中构造函数的调用次序

A:调用基类构造函数,调用顺序按照他们被继承时声明的顺序
B:调用成员对象的构造函数,调用顺序按照他们在类中声明的顺序
C:执行派生类构造函数中的内容

1.4 派生类中的构造函数

A:若建立派生类对象时调用了缺省的拷贝构造函数,则编译器将自动调用基类缺省的拷贝构造函数
B:   若编写派生类的拷贝构造函数,则需要为基类相应的拷贝构造函数传递参数,例如C(C &c1):B(c1) {}

2.继承时的析构函数

A:基类的析构函数也不能被继承,派生类需要自行声明
B:声明的方法与一般(无继承关系)类的析构函数相同
C:不需要显式地调用基类的析构函数,系统会自动的隐式调用
D:析构函数的调用次序与构造函数相反
#include <iostream>
using namespace std;class B1{
public: B1(int i) {cout<<"constructing B1 "<<i<<endl;}~B1() {cout<<"destructing B1 "<<endl;}
};
class B2{
public:B2(int j) {cout<<"constructing B2 "<<j<<endl;}~B2() {cout<<"destructing B2 "<<endl;}
};
class B3{
public:B3() {cout<<"constructing B3 *"<<endl;}~B3() {cout<<"destructing B3 "<<endl;}
};
///
class C: public B1, public B2, public B3{
public:C(int a,int b, int c,int d):memobj1(c),B1(a),B2(b),memobj2(d) {cout<<"constructing C "<<endl;}
private:B2 memobj2;B1 memobj1;B3 memobj3;
};
void main()
{C obj(1,2,3,4);
}

运行结果:

派生类中构造函数与虚构函数的研究相关推荐

  1. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  2. 基类成员的public访问权限在派生类中变为_C++ 派生类的构造函数(学习笔记:第7章 06)...

    派生类的构造函数[1] 默认情况 基类的构造函数不被继承; 派生类需要定义自己的构造函数. C++11规定 可用using语句继承基类构造函数. 但是只能初始化从基类继承的成员. 派生类新增成员可以通 ...

  3. C++学习笔记-----永远不要在派生类中改变虚函数的默认参数值

    提到虚函数,我们就会自然而然的想到多态,但是当虚函数中存有默认参数值的时候,在派生类中重定义这个虚函数时不可以改变这个参数的值. 请看下面的例子: #include "stdafx.h&qu ...

  4. 类中构造函数、析构函数与赋值函数的重写

    类中构造函数.析构函数与赋值函数的重写 class String { public: String(const char *str = NULL); // 普通构造函数 String(const St ...

  5. C++:派生类中的构造函数问题

    1.基类中没有定义构造函数(就是用默认构造函数)或像下面这种定义一个空的构造函数.此时派生类中的构造函数就照常写 #include<iostream> using namespace st ...

  6. 避免在派生类中重新定义基类的非虚函数

    我们都知道,在基类中定义虚函数的目的是允许派生类拥有相同接口却可以有不同的实现,通过对象的指针或引用来访问虚函数可以实现运行时的多态.这么说来,在派生类中重定义(override)虚函数是没有任何问题 ...

  7. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  8. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  9. C++基类和派生类的构造函数(一)

    前面我们说基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成 ...

最新文章

  1. PAT题解-1118. Birds in Forest (25)-(并查集模板题)
  2. 互联网或将进入泡沫2.0时代
  3. kafka配置公网IP访问
  4. java 中jtextfield访问限制_java.swing JtextField 中怎么限制只能输入数字
  5. [渝粤教育] 中国地质大学 电路理论(新) 复习题 (2)
  6. 软件测试之python面试题_常见Python面试题整理带答案
  7. C++之实现优先队列
  8. 量化交易:聚宽,(1)
  9. VS2017编译SNMP库
  10. 关于触摸屏触摸驱动安装步骤
  11. 【递归算法】递归算法的快速入门
  12. git新建账号_Git的安装以及注册账号等操作
  13. 路由器上面的WAN口和LAN口是什么意思
  14. 深入理解浏览器兼容性模式
  15. 2017 php 免费空间,免费空间免费php空间
  16. JS结合PHP瀑布流,JavaScript_原生JS实现响应式瀑布流布局,原生JS实现的瀑布流布局,代 - phpStudy...
  17. where is java_Linux下的搜索查找命令的详解(whereis)
  18. 【烈日炎炎战后端】MySQL理论(2.8万字)
  19. 决策树算法实现:泰坦尼克号乘客生存预测 (python实现)
  20. 随性随笔_201606

热门文章

  1. XML的序列化和反序列化 详细介绍
  2. 查看windows下系统信息
  3. 嵌入式Linux中I2C设备驱动程序的研究与实现
  4. NYOJ 711 最舒适的路线(并查集)
  5. Golang之空结构体和零长数组的实践
  6. 字字谏言!Python入门学习教程:关于Python不得不说的事儿
  7. 关于lombok插件的使用,强大的简化代码工具
  8. mapReducer第一个例子WordCount
  9. 如何创建一个新浪微博应用以及获得Access token
  10. 关于arm-linux-gcc的安装与配置