【C++grammar】名字隱藏與重定義

目錄

  • 1、繼承中的名字隱藏
    • 1.基類同名函數被隱藏的現象描述
    • 2.問題理解
    • 3.避免現象
  • 2、重定義
    • 1.現象描述
    • 2.重定義與重載的區別
    • 3.能否使用 using 將基類成員引入到派生類定義中

1、繼承中的名字隱藏

1.基類同名函數被隱藏的現象描述

在學習變量作用域的時候知道,全局變量可能被函數里面的同名局部變量所隱藏,如果要在函數里面使用這個同名全局變量,那么就要使用域解析運算符。

在繼承中也會出現上述類似的情況,下面是名字隱藏的形式:

基類和派生類中都有一個同名函數,不同的是派生類的函數有個整型形參。

在主函數中調用f(),那么調用的到底是基類的函數還是派生類的函數?

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;c.f();
}

在這里插入圖片描述
編譯器會報錯。

2.問題理解

我們可以將派生類看做是內部作用域,基類看做是外部作用域。內部作用域的函數f()將外部作用域的f()給隱藏掉了。

那么在C類中就看不到基類中的f()同名函數了。

這個做法可以幫助程序員避免寫出帶有危險性的代碼。

3.避免現象

那么如何解決這個問題呢?
using 聲明語句可以將基類成員引入到派生類定義中,顯式聲明。

class P{public:void f(){}
};class C :public P{public:using P::f;void f(int x){}
};
int main()
{C c;c.f();
}

其實還有兩種寫法:
1、

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;c.P::f();
}

2、

class P{public:void f(){}
};class C :public P{public:void f(int x){}
};
int main()
{C c;static_cast<P>(c).f();
}

2、重定義

1.現象描述

名字隱藏在重定義函數的時候有比較大的作用。因為有名字隱藏,所以我們可以在子類里面重新定義一個與基類里面名字參數一樣的函數

之前定義了基類shape:
在這里插入圖片描述
其中,toString函數用來描述對象的信息。基類可以調用這個函數,但是基類是無法輸出派生類信息的。
例如形狀就不能輸出它的派生類:圓,的半徑。只能輸出顏色和是否填充。
我們可以在派生類里面重新定義toString函數用來描述派生類對象,這樣就不會調用基類的toString函數了。

2.重定義與重載的區別

重載
多個函數名字相同,但至少以下一個特征不同:

1、參數類型(parameter type)

2、參數數量(parameter number)

3、參數順序(parameter sequence)

重定義
1、函數特征相同:同名、同參數、返回值類型

2、在基類和派生類中都有定義

3.能否使用 using 將基類成員引入到派生類定義中

派生類B中的 foo()函數是對基類A中的 foo() 函數的重定義。
那么在類B中,能否使用 using 講基類A中的foo()函數引入到派生類B中?為什么?

#include<iostream>#include<string>using namespace std; class A {public: string func() {        return "aaa";    }};class B :public A {public:using A::func; string func() {        return "bbb";    }}; int main() { A a; B b; cout<<a.func()<<endl;cout<<b.func()<<endl; }結果是:aaabbb編譯運行正常通過,所以還是調用了 子類 的函數。

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

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

相關文章

javascript 核心概念(1)-數據類型

語法 &#xff08;1&#xff09;到現在為止&#xff0c;大多數瀏覽器也還是支持到ECMAScript 第三版的標準。 核心概念就是一個語言的基本工作原理&#xff0c;涉及語法&#xff0c;操作符&#xff0c;數據類型。 &#xff08;2&#xff09;javascript的一切--變量&#xff0c;…

注解的力量 -----Spring 2.5 JPA hibernate 使用方法的點滴整理(五):使用@Component 來簡化bean的配置...

雖然我們可以通過 Autowired 在 Bean 類中使用自動注入功能&#xff0c;但是 Bean 還是在 applicatonContext.xml 文件中通過 <bean> 進行定義 —— 在前面的例子中&#xff0c;我們還是在配置文件中定義 Bean&#xff0c;通過 Autowired為 Bean 的成員變量、方法形參或構…

c語言條件語句示例_PHP中的條件語句和示例

c語言條件語句示例PHP條件語句 (PHP Conditional Statements) While coding, you may get to a point where your results can only be gotten when a condition is valid. We make use of conditional statements. Conditional statements are statements that can only be ex…

十四、聚類實戰——圖片壓縮

對同一像素點值的像素點歸為一類&#xff0c;通過平均值進行取代&#xff0c;從而將圖像進行壓縮并且保證圖像盡可能不失真&#xff0c;關鍵信息仍保留。 from PIL import Image import numpy as np from sklearn.cluster import KMeans import matplotlib import matplotlib.…

步驟菜單使用css3實現

代碼庫&#xff1a;http://thecodeplayer.com/walkthrough/css3-breadcrumb-navigation 有興趣的可以看一下&#xff0c;看完絕對讓你大飽眼福。首先截圖&#xff0c;看效果看著很酷吧&#xff0c;其實實現起來也不是很難&#xff0c;里邊需要用的技術有:box-shadow,計數器&…

【嵌入式系統】STM32串口通信的四種方法(基于RTOS)

目錄1、串行通信的基本參數2、輪詢方式代碼效果3、中斷方式代碼效果4、中斷加上時間戳方式代碼及效果5、DMA空閑中斷方式接收數據1、串行通信的基本參數 串行端口的通信方式是將字節拆分成一個接一個的位再傳輸出去&#xff0c;接收方再將此一個一個的位組合成原來的字符&…

大數據 java 代碼示例_Java變量類型與示例

大數據 java 代碼示例Java變量 (Java variables) Variables are the user-defined names of the memory blocks, and their values can be changed at any time during program execution. They play an important role in a class/program as they help in to store, retrieve…

畢業設計

位置跟蹤系統工作原理&#xff08;博聞網&#xff09; http://science.bowenwang.com.cn/location-tracking.htm Azuma是這樣定義增強現實的 :虛實結合 ,實時交互 ,三維注冊 環境搭建&#xff1a; http://cvchina.net/thread-173-1-1.html http://blog.csdn.net/jdh99/article/…

十五、聚類的評估

一、Given Label 均一性homogeneity&#xff1a;一個簇中只包含一個類別樣本&#xff0c;Precision 完整性completeness&#xff1a;同類別樣本被歸到同一個簇中&#xff0c;Recall 將均一性h和完整性c進行結合(二者加權平均)得到V-Measure&#xff0c;&#xff0c;β為權重 …

SQL SERVER作業的Schedules淺析

SQL SERVER作業的計劃&#xff08;Schedules&#xff09;&#xff0c;如果你沒仔細研究過或沒有應用一些復雜的計劃&#xff08;Schedules&#xff09;&#xff0c;那么你覺得SQL SERVER作業的計劃(Schedules)非常好用&#xff0c;也沒啥問題&#xff0c;但是我要告訴你一個“殘…

leetcode 51. N 皇后 思考分析

目錄題目思考AC代碼題目 n 皇后問題研究的是如何將 n 個皇后放置在 nn 的棋盤上&#xff0c;并且使皇后彼此之間不能相互攻擊。 思考 首先以N4為例&#xff0c;畫出解空間樹的一部分&#xff1a; 根據模板&#xff1a; void backtracking(參數) {if(終止條件){存放結果…

Django實戰(18):提交訂單

前面的內容已經基本上涵蓋了Django開發的主要方面&#xff0c;我們從需求和界面設計出發&#xff0c;創建模型和修改模型&#xff0c;并通過scaffold作為開發的起點&#xff1b;在scaffold的基礎上重新定制模板&#xff0c;并且通過Model類和Form類對用戶輸入的數據進行校驗。我…

No module named ‘tensorflow.examples‘解決方案

想從tensorflow中導入mnist手寫數字數據集&#xff0c;結果報錯 from tensorflow.examples.tutorials.mnist import input_data import tensorflow.compat.v1 as tf tf.disable_v2_behavior()my_mnist input_data.read_data_sets("MNIST_data_bak/", one_hotTrue)&…

julia example_使用Julia中的Example的sign()函數

julia exampleJulia| sign()函數 (Julia | sign() function) sign() function is a library function in Julia programming language, it returns the sign of the given value in the form of -1/1. sign()函數是Julia編程語言中的庫函數&#xff0c;它以-1 / 1的形式返回給…

.NET通用基本權限系統

DEMO下載地址&#xff1a; http://download.csdn.net/detail/shecixiong/5372895 一、開發技術&#xff1a;B/S(.NET C# ) 1、Windows XP以上 (支援最新Win 8) 2、Microsoft Visual Studio 2010/2012 C#.NET 3、.NET Framework 4.0以上 (支援最新4.5版本) 4、SQL Server 2005以…

leetcode 37. 解數獨 思考分析

目錄題目核心思路的不斷細化1、核心框架2、考慮到每個位置的工作3、考慮到到達最后一列、該位置的數已經預置的情況4、判斷是否符合規則的函數5、確定遞歸終止條件確定函數返回值AC代碼題目 編寫一個程序&#xff0c;通過填充空格來解決數獨問題。 一個數獨的解法需遵循如下規…

快速完成兼職外包開發任務

做了很多年的開發相關的工作&#xff0c;做過兼職開發&#xff0c;也做過外包一些開發項目。 兼職人員角色時 正是經歷這些事情時&#xff0c;每次就要提前很費經的跟公司溝通&#xff0c;讓他們把公司內部的svn開發出去&#xff0c;但是就是很難&#xff0c;會涉及到安全各方的…

使用YOLOv5訓練NEU-DET數據集

一、下載YOLOv5源碼和NEU-DET(鋼材表面缺陷)數據集 YOLOv5源碼 NEU-DET(鋼材表面缺陷)數據集 這里的數據集已經經過處理了&#xff0c;下載即可 若通過其他途徑下載的原始數據集標簽為xml格式&#xff0c;需要轉化為txt格式XML轉txt格式腳本 二、數據集準備 NEU-DET(鋼材表…

kotlin獲取屬性_Kotlin程序獲取系統MAC地址

kotlin獲取屬性The task is to get system MAC address. 任務是獲取系統MAC地址。 package com.includehelpimport java.net.InetAddressimport java.net.NetworkInterface//Function to get System MACfun getSystemMac(): String? {return try {val OSName System.getProp…

帶分頁功能的SSH整合,DAO層經典封裝

任何一個封裝講究的是&#xff0c;使用&#xff0c;多狀態。Action&#xff1a;任何一個Action繼承分頁有關參數類PageManage&#xff0c;自然考慮的到分頁效果&#xff0c;我們必須定義下幾個分頁的參數。并根據這個參數進行查值。然后在繼承ServiceManage&#xff0c;Service…