目录
在学习过C语言以及c++的基础概念后相信大家对于面向过程的程序设计已经得心应手,那么今天我们所提到的就是c++编程思想中的面向对象程序设计,本篇文章将为大家介绍一些关于C++面向对象程序设计的基础知识点。
1.C++中的继承
众所周知,C++面向对象程序设计有三大特点,分别为继承封装与多态,那么我接下来要提到的就是三大特点之一的继承。首先,何为继承,顾名思义就是一个类继承了上一个类中的成员。其中被继承的类我们称作基类也叫父类,而继承他的类我们称作派生类也叫子类。我们举一个简单例子,比如有一个父类father,其中包含构造函数和析构函数,以及成员变量f_a。
class father
{
public:
father();
~father();
int f_a;
};
现在我们再创建一个子类son,并且想要实现继承父类中的成员。我们需要做如下声明,声明方式为class+派生类名+:+继承方式+基类名;
//声明方式为class+派生类名+:+继承方式+基类名;
class son:public father
{
public:
int s_a;
};
此时子类son中已经继承了父类father中的成员变量f_a,这里有一个特殊的知识点,就是构造函数以及析构函数都是无法被继承的只会在父类中起作用而不会被继承到子类,包括父类中的友元关系也无法被子类继承。可以理解为父亲的部分物品可以继承给儿子但是儿子无法涉及父亲的交际圈。
2.继承方式以及区别
我们之前提到过C++类中的成员权限有三种,分别为public,protected,private。而他们也分别对应了C++中的三种继承方式。其中public可以继承父类中所有的公共成员并且转化为自己的公共成员,而protected则可以继承父类中的保护及公共成员并且转化为自己的保护成员,最后private同样可以继承父类中的保护和公共成员转化为自己的私有成员。代码示例如下:
class father //创建一个父类
{
private:
int f_a; //私有成员
protected:
int f_b; //保护成员
public:
int f_c; //公共成员
};
class son1 :public father //公共继承
{
//继承之后的成员等效为
public:
int f_c;
//正常编译过程中此段代码默认被编译器隐藏
//此举是为更好理解继承的含义
//以下同理
};
class son2 :protected father
{
protected:
int f_b;
int f_c;
};
class son3 :private father
{
private:
int f_b;
int f_c;
};
需要注意的一点是无论哪种继承方法都无法继承父类中的私有成员。
3.构造函数以及析构函数的调用顺序
在了解完继承的基本概念之后,我们会发现这样一个问题,我们之前提到过构造函数以及析构函数的定义,即构造函数调用一次,析构函数调用一次。那么如果子类与父类中同时存在构造函数与析构函数那么系统将会首先调用谁的构造函数,析构函数的调用顺序又是如何呢,例如以下代码:
class father
{
public:
father()
{
cout<<"父类中的构造函数被调用"<<endl;
}
~father()
{
cout<<"父类中的析构函数被调用"<<endl;
}
};
class son: public father
{
public:
son()
{
cout<<"子类中的构造函数被调用"<<endl;
}
~son()
{
cout<<"子类中的析构函数被调用"<<endl;
}
};
我们运行一下试试结果如何,结果如下:
没错,结论就是先调用父类中的构造函数然后再调用子类中的构造函数,析构函数的调用顺序则与之相反。
4.小总结:
本次内容主要了讲解了c++面向对象程序设计中的一些基础知识点,主要内容即C++中对于继承的基本概念其中包括继承的含义,继承方式,以及调用顺序等,本篇内容都为C++面向对象设计的基本思想,若想更深的理解以及体会,还请大家在日常学习中多多努力,希望大家学有所成,最后附上本段讲解代码:
#include<iostream>
using namespace std;
class father1
{
private:
int f_a;
protected:
int f_b;
public:
int f_c;
};
class son1 :public father1
{
public:
int f_c;
};
class son2 :protected father
{
protected:
int f_b;
int f_c;
};
class son3 :private father
{
private:
int f_b;
int f_c;
};
class father
{
public:
father()
{
cout << "父类中的构造函数被调用"<<endl;
}
~father()
{
cout << "父类中的析构函数被调用"<<endl;
}
};
class son : public father
{
public:
son()
{
cout << "子类中的构造函数被调用"<<endl;
}
~son()
{
cout << "子类中的析构函数被调用"<<endl;
}
};
int main()
{
son s;
}