繼承易錯總結

1.繼承會將所有的成員繼承下來,但是繼承方式限定的是繼承下來成員的可見類型(如果是private繼承,那么他不論哪里都是不可見的;如果是protected繼承在類中是可見的,在類外是不可見的;如果是public繼承,在任何地方都是可見的)

2.對于靜態成員變量,不計入字節大小

3.虛函數類外定義時,不必加virtual

4.編譯時多態——靜態多態——模板和重載
運行時多態——動態多態——虛函數

友元函數 構造函數 static靜態函數 不能用virtual關鍵字修飾;
普通成員函數 和析構函數 可以用virtual關鍵字修飾;

靜態成員變量類內聲明類外初始化
靜態成員變量為什么不能設置為虛函數:
靜態成員函數不屬于任何成員,屬于整個類,不能使用this來訪問
virtual構成的虛函數,恰恰是使用this指針訪問,this->vfptr-> 虛函數地址
靜態成員函數沒有this指針,實現多態就是需要不同的對象,調用不同的子類進行訪問不同的重寫函數

class A
{static int _tem;//靜態成員變量類內聲明,類外初始化
};int A::_tem = 0;//在類外初始化的時候不加static

靜態成員變量會繼承使用權,但是不能被包含
靜態成員變量不存儲在類中,計算類的大小的時候不計算他的字節大小

重載:同一個作用域中,函數名相同,參數類型不同,參數數量不同,參數順序不同
重定義(隱藏):繼承中,函數名相同(可使用作用域進行訪問)
重寫(覆蓋):繼承的虛函數中,子類重寫父類的虛函數

派生類的構造函數,不寫會調用默認的構造函數,但是如果自己寫,就要自己調用父類的構造函數(在調用父類的構造函數時,要將父類當成一個整體)

class Base
{
public:Base(){puts("Base()");}Base(int a):_a(a){puts("Base(int a)");}Base(const Base& tem){puts("Base(const Base& tem)");}Base& operator=(const Base& tem){puts("Base& operator=(const Base& tem)");_a = tem._a;return *this;}~Base(){puts("Base");}
private:int _a;
};
class Son:public Base
{
public:Son(){puts("Son()");}Son(int a, int b):Base(a),_b(b){puts("Son(int a,int b)");}Son(const Son& tem):Base(tem){//父類接受子類的對象/引用/指針puts("Son(const Son& tem)");}Son& operator=(const Son& tem){puts("Son& operator=(const Son& tem)");Base::operator=(tem);return *this;}~Son(){//在析構函數的時候,可以不手動調用析構函數//編譯器會自動調用父類的析構函數puts("~Son()");}
private:int _b;
};

inline能不能是虛函數:可以(內斂函數沒有地址)
多態調用:內斂不起作用(多態調用中,虛函數存在虛函數表中,需要地址,但是內聯函數沒有地址,所以內斂不起作用)
普通調用:內斂起作用

構造函數能不能是虛函數?不能
虛表是在編譯時生成,構造的時候進行初始化
如果構造函數是虛函數,那么在實例化對象的時候,如何應該去虛表中找構造函數的地址,但是這時候虛表還沒有初始化

多態調用和普通函數的時間效率?
具體要看是否構成多態,調用需要到需表中找地址進行調用,普通成員函數可以直接調用

多態的本質——虛表
當父類的指針/引用接收子類的地址/對象時,因為是繼承會進行切割,將子類的父類那部分切出來,剩下的就是去虛表中找地址進行調用就行了

父類=子類;會將父類的那部分切出來拷貝給父類,但是不會拷貝虛函數表指針
虛函數指針如果進行了拷貝,那么父類對象的虛函數表指針會發生改變,當使用父類對象調用父類的虛函數時,就會發生錯誤

虛函數繼承,繼承的是接口,參數類型不會改變;當子類對象要調用父類的函數時,使用切片的手法進行調用
普通函數繼承,繼承的是實現


子類和父類都有虛函數,子類的虛函數會存到哪里
在這里插入圖片描述

從右表中可以看到,應該是有三個虛函數,他們在同一個虛表中
子類中沒有虛表,子類的虛函數存到父類的虛表中

在這里插入圖片描述

可以記成向上合并

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530864.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530864.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530864.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flat在java中的含義_Java 9中Collectors.flatMapping()方法的重要性?

在Java 9中,向Collectors類添加了一個新方法:flatMapping()。它類似于Collectors.mapping()方法,其中flatMapping()方法允許我們處理嵌套的集合。 Collectors.flatMapping()方法需要的功能將被施加到輸入元件和集電極積累通過功能傳遞的元件。…

hhkb適合寫java嗎_起底這屆HHKB最強新品鍵盤,究竟好在哪兒?

2019年12月HHKB上市了3大品類的12款新品鍵盤,今天為大家分享外設天下為HHKB Professional HYBIRD Type-S 雙模靜音旗艦版靜電容鍵盤做的評測,起底這屆HHKB新品的最強新品。近日,HHKB更新了旗下的在售產品系列,為了滿足嚴肅、安靜辦…

java暫停5s_java如何實現繼續/暫停按鈕

匿名用戶1級2016-11-24 回答很簡單,我給你寫一個Demo:import java.awt.event.*;import javax.swing.*;public class Demo extends Thread {private JFrame frm new JFrame("Demo");private JButton btnPause new JButton("Pause")…

c mysql數據庫_C實現MySQL數據庫操作

C實現MySQL數據庫操作兩個月前,也就是9月份,心血來潮在windows下實現了用C連接數據庫,當時很是有把linux下一并給實現了。但是沒有想得那么簡單。這個任務一直推遲到了現在才完成,究其原因:1.我直接用eclipse開發工具&…

php生成不重復時間戳,PHP獲取時間戳和微秒數以及生成唯一ID

microtime函數描述:返回當前Unix時間戳和微秒數語法:mixed microtime( [ bool $get_as_float ] )//直接輸出echo microtime();//得到的是 如:0.26672100 1585622985 前面是當前微秒數,后面是正常時間戳,中間以空格分隔…

php異步處理任務工具,PHP實現異步任務分發處理利器-Gearman

通常,多語言多系統之間的集成是個大問題,一般來說,人們多半會采用WebService的方式來處理此類集成問題,但不管采用何 種風格的WebService,如RPC風格,或者REST風格,其本身都有一定的復雜性。相比…

java dos窗口小工具下載,maxdos 9 3-maxdos工具箱 v9.3 官方版

maxdos 9 3maxdos工具箱是一個dos工具箱,maxdos工具箱為安裝好的電腦系統加入dos,方便用戶維護與備份還原,是完全傻瓜化的工作模式,更是可以直接啟動硬盤上的光盤ISO鏡像一鍵啟動。maxdos工具箱特色說明:1、支持進入DO…

java 1.7 linux rpm,linux下用rpm 安裝jdk 7的jdk-7u79-linux-x64.rpm

linux下用rpm 安裝jdk 7的jdk-7u79-linux-x64.rpm步驟一、下載jdk的rpm安裝包步驟二、如果linux是centos的話,請先卸載openjdk,參考文檔:使用rpm命令卸載CentOS 6.4自帶的OpenJDK步驟三、安裝jdk-7u79-linux-x64.rpm安裝包先執行以下命令給所…

普通用戶無法執行java,CentOS tomcat普通用戶執行配置安裝

CentOS tomcat經過長時間的發展,這里我發表一下個人理解,下面就這就來講術CentOS tomcat。CentOS tomcat6_jdk1.6_安裝配置_開啟自動運行,普通用戶執行 (轉)秀脫linux筆記之CentOS tomcat6實戰篇由于前段時間一直在外頭出差,沒有完成CentOS t…

elementui樹形復選框,element-ui checkbox 組件的樹形聯動

前言示例版本為 Element-ui 2.13.0 Vue 2.6.11最近想弄 Element-ui checkbox 的多級聯動,網上相關的例子大多數為二級聯動,自己研究了一下,弄了一個樹形菜單的多級聯動,常用于角色管理等業務。(僅供參考,未考慮性能問…

php 魔術方法 sleep,php 魔術方法 sleep() wakeup()

__sleep() 和 __wakeup()public array __sleep ( void )void __wakeup ( void )serialize() 函數會檢查類中是否存在一個魔術方法 __sleep()。如果存在,該方法會先被調用,然后才執行序列化操作。此功能可以用于清理對象,并返回一個包含對象中…

java 先入先出,java_阻塞隊列(FIFO先進先出)

java_阻塞隊列(FIFO先進先出)ArrayBlockingQueue:由數組結構組成的有界阻塞隊列;LinkedBlockingQueue:由鏈表結構組成的有界阻塞隊列(但大小默認值為:Integer.MAX_VALUE);PriorityBlockingQueue:支持優先級…

PHP能在Mac上運行嗎,PHP Composer無法在Mac上運行

我安裝了bitnami mac堆棧主要是因為我的項目需要至少PHP 5.4.7版本.但是,我遇到了作曲家的問題.這是我跑步時遇到的錯誤:php composer.phar install --dev錯誤:Richard-Knops-MacBook-Pro:my-project richardknop$php composer.phar install --devdyld: …

主機安裝php網站,php支持虛擬主機(php網站空間)

php設置虛擬主機,主要是為了在ie輸入地址欄是,可以輸入任意的,而不是localhost/,為了方便,但是設置起來很不方便的。。發現不能實現每個站點使用不同的PHP版本,想向大家求教一下,有沒有能讓。支…

php時分獲取秒數,javascript與php時/分/秒與秒數互轉

javascript:/*時間轉換成秒*/function time_to_second(time){var arr time.split(‘:‘)var hour arr[0]?arr[0]:0var minute arr[1]?arr[1]:0var second arr[2]?arr[2]:0var ret hour * 3600 minute * 60 secondreturn ret}/*秒轉換成時間*/function sec…

lbp matlab程序,求教大神給解釋一下LBP特征提取每部分程序是干什么的

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓function X1 LBP(Resimage)% Returns a rotation invariant LBP (uniform patterns) histogram (10 bins)% of picture X.% the size of picture X must be at least 3x3 pixelsw1 (1/sqrt(2))^2;%根號1/2平方w2 (1-1/sqrt(2))*…

python以20字符寬居中輸出,Python 字符串內置方法(一)

以下方法只需要知道用法就行了,權當了解,不用硬背,以后需要用到的時候再回來看說明:一般方法中前面是is開頭的就是判斷來的,輸出不是True就是False,例如isalpha()方法capitalize()方法:首字母大…

php 復選框全選和取消,基于JavaScript實現復選框的全選和取消全選

這篇文章主要為大家詳細介紹了基于JavaScript實現復選框的全選和取消全選,具有一定的參考價值,感興趣的小伙伴們可以參考一下本文實例為大家分享了js復選框的全選和取消全選的具體代碼,供大家參考,具體內容如下效果圖:…

oracle 字段全大寫,Oracle如何批量將表中字段名全轉換為大寫(利用簡單存儲過程)...

前言今天查詢一個數據字段一直提示字符無效,明明在數據庫表字段中是存在的;查詢后得知,數據庫表字段為小寫時,查詢需要將字段名小寫并加上雙引號;表名同理,我這里表名是大寫,暫時不需要改。搜到…

oracle的al32utf8,oracle字符集修改(AL32UTF8-UTF8)

author:skatetime:2012/04/10AL32UTF8->UTF8步驟shutdown immediate;startup mount;alter session set sql_tracetrue;alter system enable restricted session;alter system set job_queue_processes0;alter system set aq_tm_processes0;alter data…