C++快速入門---繼承機制中的構造器和析構器(11)
阿新 • • 發佈:2018-11-04
C++快速入門---繼承機制中的構造器和析構器(11)
比如基類有個構造器,如Animal(),它將在創造Pig型別的物件時最先被呼叫,如果Pig類也有一個構造器,它將排在第二個被呼叫。因為基類必須在子類之前初始化原則!(先有老爸,再有兒子)
Animal::Animal(std::string theName)
{
name = theName;
}
Pig::Pig(std::string theName) : Animal(theName)
{
}
在子類的構造器定義的“: Animal(theName)",其語法的含義是:當呼叫Pig()構造器時(以theName作為輸入引數),Animal()構造器也將被呼叫(theName輸入引數將傳遞它)
子類在建立物件、例項時,先呼叫父類的構造方法,再呼叫自己的構造方法(先有父親,再有兒子)。呼叫完子類後,先呼叫子類的析構器,然後再呼叫父類的析構器。一層一層的遞進。
程式碼如下:
#include <iostream> #include <string> class Animal//基本 { public: std::string mouth;//嘴巴 std::string name; Animal(std::string theName); void eat(); void sleep(); void drool();//流口水 }; //Pig繼承於Animal class Pig : public Animal { public: void climb();//上樹 Pig(std::string theName); }; class Turtle : public Animal { public: void swim(); Turtle(std::string theName); }; Animal::Animal(std::string theName) { name = theName; } 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; } Pig::Pig(std::string theName) : Animal(theName) { } void Pig::climb() { std::cout << "我是一隻漂亮的小母豬豬,我會上樹,我正在爬樹。。噓。。" << std::endl; } Turtle::Turtle(std::string theName) : Animal(theName) { } void Turtle::swim() { std::cout << "我是一隻小甲魚,當母豬想抓我的時候,我就游到海里。。哈哈。。" << std::endl; } int main() { Pig pig("小豬豬"); Turtle turtle("小甲魚"); std::cout << "這隻豬的名字是:" << pig.name << std::endl; std::cout << "每隻烏龜都有個偉大的名字:" << turtle.name << std::endl; pig.eat(); turtle.eat(); pig.climb(); turtle.swim(); return 0; }
程式碼如下:
子類在建立物件、例項時,先呼叫父類的構造方法,再呼叫自己的構造方法。呼叫完子類後,先呼叫子類的析構器,然後再呼叫父類的析構器。一層一層的遞進。
#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\n"; } BaseClass::~BaseClass() { std::cout << "進入基類析構器。。。。\n"; std::cout << "我在基類析構器裡邊也幹了某些事。。。。\n\n"; } void BaseClass::doSomething() { std::cout << "我幹了某些事。。。。\n\n"; } SubClass::SubClass() { std::cout << "進入子類構造器。。。。\n"; std::cout << "我在子類構造器裡邊還幹了某些事。。。。\n\n"; } SubClass::~SubClass() { std::cout << "進入子類析構器。。。。\n"; } int main() { SubClass subclass; subclass.doSomething(); std::cout << "完事,收工"; return 0; }