【C++】【学习笔记】【017】继承机制中的构造器和析构器
2014-11-10 17:47
387 查看
1、基类必须在子类之前初始化。如:对于基类Animal和子类Pig,如果基类有个构造器Animal(),它将在创造Pig类型的对象时最先被调用,如果Pig类也有一个构造器Pig(),它将在第二个被调用。
2、如果构造器带着输入参数,情况就比较复杂了;如下所示:
a、当调用Pig()构造器时(以theName作为输入参数),Animal()构造器也将被调用(theName输入参数将传递给它);
b、当我们调用Pig pig("Little pig");将把字符串"Little pig"传递给Pig()和Animal(),赋值动作将实际发生在Animal()方法里。
样例:
1、在销毁某个对象时,基类的析构器也将被自动调用,但这些事情编译器会自动处理;
2、因为析构器不需要输入参数,所以根本用不着使用SuperClassMethod(argument)语法;
3、与构造器的情况相反,基类的析构器将在子类的最后一条语句执行完毕后才被调用;
样例:
样例:
2、如果构造器带着输入参数,情况就比较复杂了;如下所示:
// 动物基类 class Animal { public: std::string name; Animal(std::string theName); }; Animal::Animal(std::string theName) { name = theName; } // 猪子类 class Pig : public Animal { public: Pig(std::string theName); void climb(); }; Pig::Pig(std::string theName) : Animal(theName) { }
a、当调用Pig()构造器时(以theName作为输入参数),Animal()构造器也将被调用(theName输入参数将传递给它);
b、当我们调用Pig pig("Little pig");将把字符串"Little pig"传递给Pig()和Animal(),赋值动作将实际发生在Animal()方法里。
样例:
#include <iostream> #include <string> // 动物基类 class Animal { public: // 基类属性 std::string mouth; std::string name; // 构造函数 Animal(std::string theName); // 基类方法 void eat(); void sleep(); void drool(); // 流口水 }; Animal::Animal(std::string theName) { name = theName; } void Animal::eat() { std::cout << "Animal: I'm eating!" << std::endl; } void Animal::sleep() { std::cout << "Animal: I'm sleeping!" << std::endl; } void Animal::drool() { std::cout << "Animal: I'm drooling!" << std::endl; } // 猪子类 class Pig : public Animal { public: Pig(std::string theName); void climb(); }; Pig::Pig(std::string theName) : Animal(theName) { } void Pig::climb() { std::cout << "Pig: I'm climbing!" << std::endl; } // 乌龟子类 class Turtle : public Animal { public: Turtle(std::string theName); void swim(); }; Turtle::Turtle(std::string theName) : Animal(theName) { } void Turtle::swim() { std::cout << "Turtle: I'm swimming!" << std::endl; } int main() { Pig pig("Little pig"); Turtle turtle("Little turtle"); std::cout << pig.name << std::endl << turtle.name << std::endl; pig.eat(); turtle.eat(); pig.climb(); turtle.swim(); return 0; }
输出: Little pig Little turtle Animal: I'm eating! Animal: I'm eating! Pig: I'm climbing! Turtle: I'm swimming!
1、在销毁某个对象时,基类的析构器也将被自动调用,但这些事情编译器会自动处理;
2、因为析构器不需要输入参数,所以根本用不着使用SuperClassMethod(argument)语法;
3、与构造器的情况相反,基类的析构器将在子类的最后一条语句执行完毕后才被调用;
样例:
#include <iostream> #include <string> class BaseClass { public: BaseClass(); ~BaseClass(); void doSomething(); }; BaseClass::BaseClass() { std::cout << "Into BaseClass constructor.\n"; } BaseClass::~BaseClass() { std::cout << "Into BaseClass destructor.\n"; } void BaseClass::doSomething() { std::cout << "BaseClass::doSomething.\n"; } class SubClass : public BaseClass { public: SubClass(); ~SubClass(); }; SubClass::SubClass() { std::cout << "Into SubClass constructor.\n"; } SubClass::~SubClass() { std::cout << "Into SubClass destructor.\n"; } int main() { SubClass subclass; subclass.doSomething(); std::cout << "Over!\n"; return 0; }
输出: Into BaseClass constructor. Into SubClass constructor. BaseClass::doSomething. Over! Into SubClass destructor. Into BaseClass destructor.
样例:
相关文章推荐
- [C++学习笔记]构造器析构器与this指针
- 继承机制中的构造器和析构器 - C++快速入门17
- 混迹于C++之继承机制中的构造器和析构器
- C++(笔记)解释继承机制中构造器与析构器
- 【c++】继承机制中的构造器和析构器
- 继承机制中的构造器和析构器 - C++快速入门17
- 2012/1/31 《C++ Primer Plus》第十三章:类继承 学习笔记
- 《Javascript高级程序设计》(第2版)学习笔记09--继承机制
- c++入门学习笔记继承
- 【Javascript学习笔记】由JavaScript中call()方法引发的对面向对象继承机制call的思考
- C++学习笔记十九-多重继承与虚继承
- C++学习笔记(九) 异常机制
- C\C++ 程序员从零开始学习Android - 个人学习笔记(八) - java基础 - 继承、抽象类、接口、内部类(待续)
- C++学习笔记-类的继承(派生类)
- C++学习笔记(19)——多继承中的虚函数
- C++学习笔记1:virtual 继承
- C++学习笔记之MFC消息机制(转)
- C\C++ 程序员从零开始学习Android - 个人学习笔记(八) - java基础 - 继承、抽象类、接口、内部类(待续)
- [C++学习笔记]继承
- 钱能C++程序设计教程第10章继承学习笔记