C++提高:继承

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++提高:继承相关的知识,希望对你有一定的参考价值。

题目

定义 A、B、C、D 四个类,D 继承 C、C 继承 B、B 继承 A,查看 A、B、 C、D 类中构造函数、析构函数、拷贝构造函数调用顺序

代码

在这里插入图片描述

#include <iostream>
using namespace std;

class A {
public:
	void Draw() { cout << "A::Draw()" << endl; }
	void Erase() { cout << "A Erase()" << endl; }
	A() { Draw(); }
	~A() { Erase(); }
};

class B :public A {
public:
	B() { Draw(); }
	void Draw() { cout << "B::Draw()" << endl; }
	void Erase() { cout << "B Erase()" << endl; }
	~B() { Erase(); }
};

class C :public B {
public:
	C() { Draw(); }

	void Draw() { cout << "C::Draw()" << endl; }
	void Erase() { cout << "C Erase()" << endl; }
	~C() { Erase(); }
};

class D :public C{
public:
 D() { Draw(); }
 void Draw() { cout << "D::Draw()" << endl; }
 void Erase() { cout << "D Erase()" << endl; }
 ~D() { Erase(); }
};

int main() {
	B b;
	C c;
	D d;
	cout << "------------------------------------------" << endl;
	return 0;
}

知识回顾

构造函数

构造函数的格式

class <类名> {
public:
	<类名>(参数列表)
		//...(还可以声明其它成员函数)
};
<类名>::<函数名>(参数表) {
	//函数体
}

构造函数特点

  1. 它的函数名与类名相同;
  2. 它可以重载;
  3. 不能指定返回类型,即使是 void 也不行;
  4. 虽然在一般情况下,构造函数不被显式调用,而是在创建对象时自动被调用。但是并不是不能被显式调用。有些时候是一定要显式调用的,只要是父类有带参的构造函数,在子类中就必须显式的调用父类的构造函数,因为子类的构造器在实例化时无法找到父类的构造函数(当父类有自己写的无参构造函数时,子类也不用显式调用)。

调用默认构造函数的三种情况

  1. 如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
  2. 如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
  3. 在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。

拷贝构造函数

拷贝构造函数的格式

class 类名
{
	public:
		类名(形参参数) //构造函数的声明/原型
		类名(类名& 对象名) //拷贝构造函数的声明/原型
		...
};

调用拷贝构造函数的情形

  1. 一个对象作为函数参数,以值传递的方式传入函数体
  2. 一个对象作为函数返回值,以值传递的方式从函数返回
  3. 一个对象用于给另外一个对象进行初始化(常称为赋值初始化)

析构函数

析构函数的格式

class <类名> {
public:
	~<类名>();
};
<类名>::~<类名>()
{
	//函数体
};

以上是关于C++提高:继承的主要内容,如果未能解决你的问题,请参考以下文章

C++之STL

C++ 软件工程中的继承

C++ 继承

C++ 提高教程 模板-类模板雨继承

C++继承

c++继承