1. 程式人生 > >派生類覆蓋基類的過載的函式

派生類覆蓋基類的過載的函式

  和其他函式一樣,類的成員函式不論是否是虛擬函式都可以被過載(過載的發生需要是在同一作用域)。然而,派生類一旦聲明瞭一個和基類過載函式同名的函式,派生類將會覆蓋基類的所有過載函式,也就是說派生類可以覆蓋基類過載函式的0個或全部個例項

  如下程式碼:

class Base
{
public:
    void func() { printf("Base func()\n"); };
    void func(int a) { printf("Base func(int a)\n");}
};

class D1 : public Base
{
public: 
    void func
(string& str) { printf("D1 func(string& str)\n"); } }; int main(void) { D1 d1; d1.func(); //報錯,基類的func()函式已被隱藏 d1.func(2); //報錯,基類的func(int)函式已被隱藏 return 0; }

  顯然,派生類D1的func(string& str)函式把基類Base中所有名為”func”的函式都隱藏了,要想通過D1呼叫func()和func(int)函式,要麼在D1類中重新定義函式,要麼使用using關鍵字將Base類中所有”func”成員包含到派生類中:

class D1 : public Base
{
public: 
    using Base::func;   //將基類的func所有過載例項到包含到D1中
    void func(string& str) { printf("D1 func(string& str)\n"); }
};

int main(void)
{
    D1 d1;

    d1.func();
    d1.func(2);

    return 0;
}

  在D1中加上”using Base::func;”後編譯通過。

  using宣告語句指定一個名字而不指定形參列表,所以一條基類成員函式的using宣告語句就可以將函式的所有過載例項新增到派生類作用域中。此時,派生類只需要定義自身特有的函式,不需要為繼承而來的其他函式重新定義。這樣,外界對派生類沒有重新定義的過載函式的訪問實際上是對using宣告點的訪問。

  需要注意的是,using關鍵字還能改變基類的該成員函式在派生類中的訪問級別:

class Base
{
protected:
    void func() { printf("Base func()\n"); }
    void func(int a) { printf("Base func(int a)\n");}
};

class D1 : public Base
{
public: 
    using Base::func;    //將原本是protected屬性改為public
    void func(string& str) { printf("D1 func(string& str)\n"); }
};

int main(void)
{
    D1 d1;

    d1.func();    
    d1.func(2);  

    return 0;
}

  編譯執行:
這裡寫圖片描述

相關推薦

派生覆蓋過載函式

  和其他函式一樣,類的成員函式不論是否是虛擬函式都可以被過載(過載的發生需要是在同一作用域)。然而,派生類一旦聲明瞭一個和基類過載函式同名的函式,派生類將會覆蓋基類的所有過載函式,也就是說派生類可以覆蓋基類過載函式的0個或全部個例項。   如下程式碼:

C++中派生重寫過載函式時需要注意的問題:派生函式遮蔽中同名函式

派生類可以繼承基類中的非私有函式成員,當然也就可以繼承其中非私有的被過載的函式。如下: 【參考程式碼】 class Base { public: void print() { cout << "print() in Base." <<

C++中派生重寫過載函式

#include<iostream> using namespace std; class Base { public: virtual void print() {  //如果不加vir

虛解構函式派生

1.情況1, class Base { public: ~Base() { cout << "~Base()" << endl; } }; class Derived1 : public Base { public: Derived1():name_

C++_派生的建構函式派生之間的特殊關係

派生類和基類的概念及派生類建構函式的原理: 建立一個叫做TableTennisPlayer的基類,記錄會員的名字和是否有球桌。 1 //宣告一個基類 2 class TableTennisPlayer 3 { 4 private: 5 string firstname; 6

定義點,並以點派生出直線,從中繼承的點的資訊表示直線的中點。

#include<iostream> #include<cmath> using namespace std; class Point //定義座標點類 { public: //定義必要的建構函式 Point(double a=0,d

繼承的建構函式

1.類的預設建構函式   1 public class BaseClass 2 { 3 public BaseClass() 4 { 5 // 6 } 7 } 8 2.派生類建構

C++中派生成員的三種訪問規則

、公有繼承的訪問規則當類的繼承方式為公有繼承時,基類的public成員和protected成員被繼承到派生類中仍作為派生類的public成員和protected成員,派生類的其它成員可以直接訪問它們。但是,類的外部使用者只能通過派生類的物件訪問繼承來的public成員。基類的private成員在私有派生類中是

派生成員的訪問許可權和派生物件對成員的訪問許可權

派生類在類內只可能訪問基類的public和protected成員 派生類物件和基類物件只能訪問自個類的public成員 基類成員在繼承後在派生類中的許可權:                

不是抽象不是好

開宗明義:不是抽象類的基類不是好基類。為什麼這麼說? 基類和派生類的關係有如下幾種: 基類可以是具體類、虛類和抽象類三種,對派生類沒有要求。其中具體類是沒有虛擬函式的類,其所有方法都提供了具體實現;派生類方法如果和基類方法同名,則派生類方法隱藏(overwrite)了基類方法。虛類是包含虛擬函式的類,

python:簡介(一)

    一:繼承:基類和派生類 區分“屬於”(is-a)和“具有”(has-a)這兩種關係。“屬於”即為繼承:在這種關係中,派生類的一個物件也屬於“基類”的一個物件。 “具有”即為“合成”:這種關係中,一個物件“具有”對其他類的一個或多個物件的引用,後者是前者的成

記mybatis-generator生成實體繼承的一個大坑

我的天哪,一個簡單的問題,搞死我了。 在我們用mybatis-generator生成實體類的時候,會希望這些實體類繼承自一個基類,這個基類包含了實體類共同的屬性,如uuid,createdate等資訊。 問題來了,直接在generatorConfig中新增roo

java中子覆蓋方法所必須滿足的條件

一、描述  子類重寫(覆蓋)父類的方法必須滿足的條件:  1.父類中的方法在子類中必須可見,即子類繼承了父類中的該方法(可以顯式的使用super關鍵字來訪問父類中的被重寫的方法), 如果父類中的方法為private型別的,那麼子類則無法繼承,也無法覆蓋。 2.子類和父類的方

Java原始碼 - Exceotion異常Throwable分析

常用的異常有:Error、Exception,這兩個類的基類都是Throwable。 其中Error是用來表示編譯時和系統的錯誤,這一類問題,基本不需要我們關心。 Exception就是我們常見的異常。由原始碼可知,Exception類自身並沒有什麼重要的東西,它只是Throwable類的一

繼承的構造函數

分享圖片 ole new 語句塊 play bsp public 過程 style 1.類的默認構造函數 1 public class BaseClass 2 { 3 public BaseClass() 4 { 5

建立SQLAlchemy的ORM(一)

SQLAlchemy功能非常強大,一般來說我們可以採用下面方法建立一個ORM類. from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base fr

不同子擁有的不同的靜態成員變數的方法

大家都知道所有子類物件(不管是相同的子類或是不同的子類)擁有基類的相同靜態成員變數。因為靜態變數是屬於類的,而不是屬於某個物件的。所以如下程式碼: #include <iostream> using namespace std; class Base { pu

所有——Object

Object public class Object java.lang.Object Class Object is the root of the class hierarchy. Every class has Object as

QT 新增C++,C++嚮導選擇時,無“QDialog;選項

1.軟體環境:  版本:5.6.1  作業系統:win10家庭版64位  MSVC版本:2013(32bit)2.問題描述:C++類嚮導基類選擇時,無“QDialog&quot;選項      

spring 子覆蓋中注入的bean

我們在設計程式框架的時候,會設計一個抽象基類,子類繼承這個基類,共有的方法放到基類中去,使用spring後使程式碼變的很簡單,現在遇到的問題是在基類中注入bean後,子類不可能都會是有這個bean,那麼需要考慮到子類需要覆蓋或者說重新注入個性化的bean 有三種方法來實現這