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:
<类名>(参数列表)
//...(还可以声明其它成员函数)
};
<类名>::<函数名>(参数表) {
//函数体
}
构造函数特点
- 它的函数名与类名相同;
- 它可以重载;
- 不能指定返回类型,即使是 void 也不行;
- 虽然在一般情况下,构造函数不被显式调用,而是在创建对象时自动被调用。但是并不是不能被显式调用。有些时候是一定要显式调用的,只要是父类有带参的构造函数,在子类中就必须显式的调用父类的构造函数,因为子类的构造器在实例化时无法找到父类的构造函数(当父类有自己写的无参构造函数时,子类也不用显式调用)。
调用默认构造函数的三种情况
- 如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
- 如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
- 在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数)。
拷贝构造函数
拷贝构造函数的格式
class 类名
{
public:
类名(形参参数) //构造函数的声明/原型
类名(类名& 对象名) //拷贝构造函数的声明/原型
...
};
调用拷贝构造函数的情形
- 一个对象作为函数参数,以值传递的方式传入函数体
- 一个对象作为函数返回值,以值传递的方式从函数返回
- 一个对象用于给另外一个对象进行初始化(常称为赋值初始化)
析构函数
析构函数的格式
class <类名> {
public:
~<类名>();
};
<类名>::~<类名>()
{
//函数体
};
以上是关于C++提高:继承的主要内容,如果未能解决你的问题,请参考以下文章