子类的构造函数,子类的析构函数,子类型关系

Posted Respect@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子类的构造函数,子类的析构函数,子类型关系相关的知识,希望对你有一定的参考价值。

子类的构造函数

调用父类的哪个构造函数

class Son : public Father {
public:
	// 在子类的构造函数中,显式调用父类的构造函数
	Son(const char *name, int age, const char *game)
		:Father(name, age) {
		this->game = game;
	}

	// 没有显式的调用父类的构造函数,那么会自动调用父类的默认构造函数
	Son(const char *name, const char *game){
		this->game = game;
	}
......
};

子类和父类的构造函数的调用顺序
当创建子类对象时, 构造函数的调用顺序:
静态数据成员的构造函数 -> 父类的构造函数 -> 非静态的数据成员的构造函数 -> 自己的构造函数

注意:
无论创建几个对象, 该类的静态成员只构建一次, 所以静态成员的构造函数只调用1次!!!
在这里插入图片描述

#include <iostream>
#include <Windows.h>

using namespace std;

class M {
public:
	M() {
		cout << __FUNCTION__ << endl;
	}
};

class N {
public:
	N() {
		cout << __FUNCTION__ << endl;
	}
};

class A {
public:
	A() {
		cout << __FUNCTION__ << endl;
	}
};

class B : public A {
public:
	B() {
		cout << __FUNCTION__ << endl;
	}
private:
	M m1;
	M m2;
	static N ms;
};

N B::ms;  //静态成员

int main(void) {
	B b;
	system("pause");
}

执行:
N::N 静态数据成员的构造函数
A::A 父类的构造函数
M::M 非静态数据成员的构造函数
M::M 非静态数据成员的构造函数
B::B 自己的构造函数

子类的析构函数

子类的析构函数的调用顺序,和子类的构造函数的调用顺序相反!!!
记住,相反即可。

#include <iostream>
#include <Windows.h>

using namespace std;

class M {
public:
	M() {
		cout << __FUNCTION__ << endl;
	}

	~M() {
		cout << __FUNCTION__ << endl;
	}
};

class N {
public:
	N() {
		cout << __FUNCTION__ << endl;
	}

	~N() {
		cout << __FUNCTION__ << endl;
	}
};

class A {
public:
	A() {
		cout << __FUNCTION__ << endl;
	}

	~A() {
		cout << __FUNCTION__ << endl;
	}
};

class B : public A {
public:
	B() {
		cout << __FUNCTION__ << endl;
	}

	~B() {
		cout << __FUNCTION__ << endl;
	}
private:
	M m1;
	M m2;
	static N ms;
};

N B::ms;  //静态成员

int main(void) {
	{
		B b;
		cout << endl;
	}
	
	system("pause");
}

执行:
N::N
A::A
M::M
M::M
B::B

B::~B
M::~M
M::~M
A::~A

静态对象在程序终止时被销毁,所以:
静态成员的析构函数,在程序结束前,是不会被调用的!

子类型关系

什么是子类型
花木兰替父从军
在这里插入图片描述
公有继承时,派生类的对象可以作为基类的对象处理,派生类是基类的子类型。
在这里插入图片描述
B类就是A类的子类型.

#include <iostream>

using namespace std;

class A {
public:
	A() {}
	~A() {}
	void kill() { cout << "A kill." << endl; }
};

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

void test(A a) {
	a.kill();  //调用的是A类对象的kill方法
}

int main(void) {
	A a;
	B b;
	test(a);
	test(b);

	system("pause");
	return 0;
}

子类型关系具有单向传递性。
C类是B类的子类型
B类是A类的子类型

子类型的作用:

在需要父类对象的任何地方, 可以使用”公有派生”的子类的对象来替代,
从而可以使用相同的函数统一处理基类对象和公有派生类对象
即:形参为基类对象时,实参可以是派生类对象

子类型的应用

1.基类(父类)的指针,可以指向这个类的公有派生类(子类型)对象。
Son yangGuo;
Father * f = &yangGuo;

2.公有派生类(子类型)的对象可以初始化基类的引用
Son yangGuo;
Father &f2 = yangGuo;

3.公有派生类的对象可以赋值给基类的对象
Son yangGuo;
Father f1 = yangGuo;

注意:以上的应用,反过来就会编译失败!

以上是关于子类的构造函数,子类的析构函数,子类型关系的主要内容,如果未能解决你的问题,请参考以下文章

3. 23 模拟面试

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

虚函数本质

c++复习笔记——继承

用C++设计一个不能被继承的类(转)

构造函数和析构函数