派生類和基類的同名成員問題
派生類中再實現一個基類中的方法會怎樣
(1)代碼實驗:派生類和基類中各自實現一個內容不同但函數原型完全相同的方法,會怎么樣
(2)結論:基類對象調用的是基類的方法,派生類對象調用執行的是派生類中重新提供的方法
(3)這種派生類中同名同參方法替代掉基類方法的現象,叫做:重定義(redefining),也有人叫做隱藏。
(4)隱藏特性生效時派生類中實際同時存在2份同名同參(但在不同類域名中)的方法,同時都存在,只是一個隱藏了另一個
#include <iostream>// 基類
class Animal {public:std::string name_;// 帶參數的基類構造函數Animal(const std::string &name) : name_(name) {std::cout << "Animal constructor called for " << name_ << std::endl;}// 基類析構函數virtual ~Animal() {std::cout << "Animal destructor called for " << name_ << std::endl;}void printf_name() { std::cout << "name_:" << name_ << std::endl; }private:};// 派生類
class Pigeon : public Animal {public:// 帶參數的派生類構造函數Pigeon(const std::string &name, int age) : Animal(name), age_(age) {std::cout << "Pigeon constructor called for " << name << " aged " << age_<< std::endl;}// 派生類析構函數~Pigeon() {std::cout << "Pigeon destructor called for age " << age_ << std::endl;}void printf_name() { std::cout << "11 name_:" << this->name_ << std::endl; }private:int age_;
};int test070101() {Animal a("Polly1");a.printf_name();Pigeon p("Polly", 3);p.printf_name();return 0;
}
類型兼容規則的常見情況及演示
(1)子類對象可以當作父類對象使用,也就是說子類對象可以無條件隱式類型轉換為一個父類對象
(2)子類對象可以直接初始化或直接賦值給父類對象
(3)父類指針可以直接指向子類對象
(4)父類引用可以直接引用子類對象
總結
理解什么是隱藏(重定義)
派生類對象直接調用時,隱藏規則生效,直接調用的肯定是派生類中重新實現的那一個
子類是一個擁有父類屬性和方法加上擁有自己的屬性和方法的獨立的類,可以降級變成父類來用
學習記錄,侵權聯系刪除。
來源:朱老師物聯網大課堂