多態(RAW)

来源:http://www.cnblogs.com/xiaojiang1025/archive/2016/09/30/5925215.html
-Advertisement-
Play Games

函數重寫overwrite: 當子類提供了和父類同名的虛函數時,稱之為函數重寫,函數的返回值類 函數名 參數列表必須完全相同 名字隱藏namehide: 當子類提供了和父類同名的數據時 叫名字隱藏 函數重載: 同一個作用域中 函數名相同 參數列表不同的函數構成重載 多態 當父類型的指針(引用)指向子 ...


函數重寫overwrite:當子類提供了和父類同名的虛函數時,稱之為函數重寫,函數的返回值類 函數名 參數列表必須完全相同
名字隱藏namehide:當子類提供了和父類同名的數據時 叫名字隱藏
函數重載:同一個作用域中 函數名相同 參數列表不同的函數構成重載

多態

當父類型的指針(引用)指向子類對象時,通過父類型的指針 調用虛函數,如果子類重寫了這個虛函數,則調用的表現是子類的,否則就是父類型中對應的實現,多態使類型更加通用,根據具體的對象做出具體的行為

  • 繼承是構成多態的基礎
  • 虛函數是構成多態的關鍵
  • 函數重寫是必備條件

應用

用在函數的參數上

void testAnimal(Dog* dog);      //不好
void testAnimal(Animal* dog);   //好

用在函數的返回值上

Cat* getAnimal(int s);          //不好
Animal* getAnimal(int s);       //好

靜態綁定:編譯時確定調用的函數地址
動態綁定:運行時確定調用函數的地址

虛表虛指針

多態的底層實現,靠的是虛函數表(虛表),
虛指針,指向虛表的指針任何一個具有虛函數的類型 只有一張虛表 同類型的對象共用虛函數表,當一個父類型的指針指向一個子類型的對象時,調用虛函數時並沒有立即生成函數的調用地址,而是先根據對象定位出對象的前4byte對象的虛函數表,再根據虛函數表中存放的函數地址進行調用,虛函數表中存放的是哪個函數,對應哪個類的實現,就調用相應的函數

類型識別

Q為什麼要有類型識別
A:多態做到的效果是類型通用,但這樣損失了對象的個性,有時候要恢復個性,根據具體的類型做出相應的個性展現

dynamic_cast<類型>(對象)    //會嘗試著把對象變成相應的類型,如果成功就返回非空,不成功就返回NULL

typeid

這個運算符可以獲得類型或者對象的類型信息, typeid返回的信息存入一個type_info類型的對象中,這個類型重載==和!=運算符,並且有個成員函數name()返回類型的名稱
/usr/include/c++/4.6 下有一個頭文件#include

抽象類

不能實例化的類,除此之外和正常沒有區別,只要在類中出現一個純虛函數(pure),這個類就是抽象類

class A{
    public:
        virtual void show()=0;  //純虛函數
};

Note:如果一個類繼承了抽象類,但沒有實現其中的純虛函數,那麼這個子類也會變成抽象類

虛析構函數

加了virtual修飾的析構函數,當父類對象的指針指向子類對象時,如果釋放指針對應的記憶體,只會調用父類對應的析構函數,子類析構行為未定義(不去調用)
如果把父類對應的析構函數改成虛析構,則會調用子類析構函數,同時由於子類的析構函數的調用必然會觸發父類析構函數的調用,上述問題得以解決
Q:什麼時候需要虛析構
A:當父類中有虛函數(此時常常需要用父類型對象指向子類型對象以實現多態)或者父子類型中都有堆記憶體處理,需要使用虛析構來釋放資源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 才學完幾個簡單的標簽 就突發奇想想做一個關於自己的網頁 再加上自己喜歡的人 然後就這麼做了 努力敲起了代碼 大概十幾分鐘的時間 一個簡單的網頁做起了 其實很low 但是還是很興奮的發給了自己的朋友 他們都說厲害了 這麼快就會做網頁了 我問我旁邊的人 她說很一般 突然就有點小失落 學得不怎麼樣 就知道 ...
  • 規則,相同則為假,不同則為真 1 ^ 1 = 0 1 ^ 0 = 1 以下為測試腳本。例子1是判斷一個數組所有的元素是否一致,例子2是異或做簡單加密的方法。 ...
  • 下邊講述Hibernate多對多關係映射。 多對多關係的表的結構為: 兩個實體表,還包含一個關係表,關係表為複合主鍵,如果要使用Hibernate多對多關係映射,則關係表必須只包含兩個欄位,如果生成了Hibernate多對多關係映射,則中間關係表不會生成實體(即沒有對應的pojo類,更沒有其映射文件 ...
  • 1、使用while迴圈輸出 1 2 3 4 5 6 8 9 10 #/usr/bin/env python# -*- coding: utf-8 -*-s = 1while s < 11: if s != 7: print(s) s += 1 2、求1-100的所有數的和 #/usr/bin/env ...
  • 1. Comparator 和 Comparable 相同的地方他們都是java的一個介面, 並且是用來對自定義的class比較大小的,什麼是自定義class: 如 public class Person{ String name; int age }.當我們有這麼一個personList,裡面包含 ...
  • 物理地址 堆的物理地址分配對對象是不連續的。因此性能慢些。在GC的時候也要考慮到不連續的分配,所以有各種演算法。比如,標記 消除,複製,標記 壓縮,分代(即新生代使用複製演算法,老年代使用標記——壓縮) 棧使用的是數據結構中的棧,先進後出的原則,物理地址分配是連續的。所以性能快。 記憶體分別 堆因為是不連 ...
  • 異常 異常(Exception)是因為程式的例外、違例、出錯等情況而在正常控制流以外採取的行為,一般分為如下兩個階段: 1.異常發生:一個錯誤發生後被列印出來,稱為未處理異常,而預設的處理則是自動輸出一些調試信息並終止程式運行。 2.異常處理:通過代碼明確地處理異常,則程式不會終止運行,並增強程式的... ...
  • package com.gdh.backtext;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry; public class BackText { String text; public BackTex ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...