您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
第17讲-继承机制中的构造器和析构器
发布时间:2021-05-16 16:27:06编辑:雪饮阅读()
子类中构造的实现
上篇了解了this指针与类的继承,那么在子类中构造又是如何使用的以及带参构造如何实现呢。
让我们根据上篇中所用的这个类与继承的实例进行改造如:
#include <iostream>
#include <string>
//动物类
class Animal{
public:
std::string mouth;
std::string name;
Animal(std::string theName);
void eat();
void sleep();
void drool();
};
void Animal::eat()
{
std::cout<<"I'm eatting!"<<std::endl;
}
void Animal::sleep()
{
std::cout<<"I'm sleeping! Don't disturb me!"<<std::endl;
}
void Animal::drool()
{
std::cout<<"我是公的,看到母的我会流口水,我正在流口水!"<<std::endl;
}
//动物类构造
Animal::Animal(std::string theName){
name=theName;
}
//猪继承动物类并扩展定义爬的方法
class Pig:public Animal
{
public:
void climb();
Pig(std::string theName);
};
void Pig::climb()
{
std::cout<<"我是"<<name<<",我爬树!"<<std::endl;
}
//猪类构造
Pig::Pig(std::string theName):Animal(theName)
{
}
//乌龟继承动物类并扩展定义游泳的方法
class Turtle:public Animal
{
public:
void swim();
Turtle(std::string theName);
};
void Turtle::swim()
{
std::cout<<"我是"<<name<<"!我可以和人一样走路,不需要爬"<<std::endl;
}
//乌龟类构造
Turtle::Turtle(std::string theName):Animal(theName){
}
int main()
{
Pig pig("猪猪侠");
Turtle turtle("忍者神龟");
pig.eat();
turtle.eat();
pig.climb();
turtle.swim();
return 0;
}
那么我们重新编译并运行如
![析构器.png](/d/file/xuewuzhijing/xindebiji/8a66cd1dfdfeba320e986cb1ae8b4f51.png)
如果需要重新编译,可以点击这个像是rebuild图标,然后编译之后就可以重新点击其左侧第二个图标重新运行了。同样的,重新编译也需要将之前的控制台先关闭掉,如果有正在运行的控制台的话。
Code blocks中建立c++文件及自动填充括号功能的撤销
在code blocks中前面又讲过如何建立一个c++项目,那么如果要向这个c++项目中单独添加一个c++文件该怎么做呢?
可以看如下步骤
![析构器.png](/d/file/xuewuzhijing/xindebiji/2b9c16f424b60cec6aabae6f85c6b132.png)
选择c++模板
![析构器.png](/d/file/xuewuzhijing/xindebiji/66103afd937d5777250970286d2d0b69.png)
选择c++语言
![析构器.png](/d/file/xuewuzhijing/xindebiji/068f3ce7c0c8391b1952e17221ed0835.png)
输入文件名选择一个完整路径
![析构器.png](/d/file/xuewuzhijing/xindebiji/56eff25263f8a0bf0ee39f2dc64e57bd.png)
然后新增的c++文件就建立出来了
![析构器.png](/d/file/xuewuzhijing/xindebiji/3e57c3806395ba2437bb3971b777ee6d.png)
Code blocks中解决花括号自己补全的问题
你是否发现,在code blocks中经常你写一个左花括号,然后自动给你补充一个右边的花括号,可能其它类型括号也是如此,其实不仅仅是code blocks这样,好多ide一般都自带这个功能,大多数ide都是国外人开发的,所以这些应该是国外人的操作习惯,而从我个人使用习惯上来说,我是不太喜欢这种操作的。那么在code blocks中如何解除这个功能呢?
看看如下步骤
![析构器.png](/d/file/xuewuzhijing/xindebiji/903c4e74b193a39626e827f6e11d47a7.png)
然后将这里红色箭头所指的地方取消勾选即可
![析构器.png](/d/file/xuewuzhijing/xindebiji/9e49de4f0c046c278c3a462f2a9d8b6c.png)
构造器、析构器、父子类、生命周期
关于构造器、析构器在父子类之间的生命周期
对于一个子类调用一个父子类都有的方法来说,则先调用基类的构造器,然后调用子类的构造器,最后才调用这个方法,而对于程序结束时候,析构的执行顺序则是先从子类的析构执行完毕,然后才执行父类(基类)的析构器。(这符合一般客观规律,先进后出)。
一个具体的实例如:
#include <iostream>
#include <string>
//基类
class BaseClass
{
public:
BaseClass();
~BaseClass();
void doSomething();
};
BaseClass::BaseClass(){
std::cout<<"进入基类构造器。。。。\n";
std::cout<<"我在基类构造器里面干了某些事。。。\n\n";
};
BaseClass::~BaseClass(){
std::cout<<"进入基类析构器....\n";
std::cout<<"我在基类析构器里面也干了某些事情....\n\n";
}
void BaseClass::doSomething(){
std::cout<<"我干了某些事情...\n\n";
}
//子类
class SubClass:public BaseClass{
public:
SubClass();
~SubClass();
};
SubClass::SubClass(){
std::cout<<"进入子类构造器....\n";
std::cout<<"我在子类构造器里面还干了某些事情....\n\n";
}
SubClass::~SubClass(){
std::cout<<"进入子类析构器.....\n";
}
int main(){
SubClass subClass;
subClass.doSomething();
std::cout<<"完事,收工!\n";
return 0;
}
则编译并运行效果如:
进入基类构造器。。。。
我在基类构造器里面干了某些事。。。
进入子类构造器....
我在子类构造器里面还干了某些事情....
我干了某些事情...
完事,收工!
进入子类析构器.....
进入基类析构器....
我在基类析构器里面也干了某些事情....
Process returned 0 (0x0) execution time : 0.035 s
Press any key to continue.
关键字词:构造器,析构器
上一篇:第16讲-this指针和类的继承
下一篇:第18讲-访问控制
相关文章
-
无相关信息