继承机制中的构造器与析构器
2015-09-06 21:56
323 查看
c++支持程序员自己写出将创建或销毁一个对象时,使用的方法,也就是构造器与析构器。1.基类和子类构造函数的调用在没有继承机制的情况下,这些方法在创建或销毁一个对象的时候被调用,比较容易理解,但加入了继承机制,构造器和析构器变得有点复杂。比如基类为Animal(), 子类为Pig。基类有个构造器,子类也有构造器,当子类的对象,即 Pig类的对象在被创建时,将第一步调用基类Animal 的构造器,第二步调用子类Pig的构造器。2.当构造器带着输入参数的情况,例如
class Animal { public: Animal(std::string theName) std::string name; }; class pig: public Animal{ public: Pig(std::string theName); };
方法的定义方法:
Animal::Animal(std::string theName){ name = theName; } Pig::Pig(std::string thePigName) : Animal(thePigNmae){ }
其中,“:Animal(theName)”语法的含义:
— 当调用Pig()构造器时(以theName 作为输入参数), Animal() 构造器也将会被调用,同时 theName 的输入参数将传递给它。
— 当调用 Pig pig (”小猪“); 将把字符串 ”小猪“ 传递给pig() 和 Animal() , 赋值动作实际发生在Animal() 方法里。
3. 当销毁某个对象时,基类的析构器也会被自动调用,但这些事编译器会自动替你处理。因为析构器不需要输入参数,所以根本用不着使用
:SuperClassMethod(arguments) 语法。
与构造器相反,基类的析构器 将在子类的最后一条语句执行完毕后才被调用。
执行顺序:
基类构造器 — > 子类构造器 —> 子类析构器 —> 基类析构器
例子:
#include <iostream> #include <string> class BaseClass { public: BaseClass(); ~BaseClass(); void doSomething(); }; class SubClass : public BaseClass { public: SubClass(); ~SubClass(); }; BaseClass::BaseClass() { std::cout <<"进入基类构造器\n" ; std::cout <<"我在基类构造器里做了某些事 \n"; } BaseClass::~BaseClass() { std::cout << "进入基类析构器 \n"; std::cout << "我在基类析构器里做了某些事 \n"; } void BaseClass::doSomething() { std::cout << "我做了某些事" << std::endl; } SubClass::SubClass() { std::cout << "进入子类构造器\n"; std::cout << "我在子类构造器里做了某些事" << std::endl; } SubClass::~SubClass() { std::cout << "进入子类析构器 " << std::endl; std::cout << "我在子类析构器里做了某些事" << std::endl; } int main() { SubClass subclass; subclass.doSomething(); std::cout << "All have been down" << std::endl; return 0; }
相关文章推荐
- sscanf()--字符串格式化输入
- HDU-4939 Stupid Tower Defense
- asp.net mvc使用gzip压缩
- SIP之旅1——注册
- 四川巴中一小学被外租开宾馆 三百学生开学无教室
- 页面异步加载树形菜单
- 摄像机模型与标定——标定函数
- 软件研发笔试题考点自我总结大全
- Android 类似朋友圈向服务器多图上传
- IIS使用 URL Rewrite Module 2.0组件 设置伪静态的方法
- [NSNull intValue]: unrecognized selector sent to instance 0x375c9860
- BackgroundWorker与线程使用
- 黑马程序员————java基础————正则表达式
- jdk,jre与jvm的区别与联系
- 大数问题
- 腾讯笔试题
- c++遍历查找文件夹路径下的所有文件(比如.txt) 使用的是MFC的CFileFind类
- MATLAB入门教程
- 程序员的人生规划
- kickstart配置文件详解