派生類覆蓋基類的過載的函式
和其他函式一樣,類的成員函式不論是否是虛擬函式都可以被過載(過載的發生需要是在同一作用域)。然而,派生類一旦聲明瞭一個和基類過載函式同名的函式,派生類將會覆蓋基類的所有過載函式,也就是說派生類可以覆蓋基類過載函式的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"選項
spring 子類覆蓋父類中注入的bean
我們在設計程式框架的時候,會設計一個抽象基類,子類繼承這個基類,共有的方法放到基類中去,使用spring後使程式碼變的很簡單,現在遇到的問題是在基類中注入bean後,子類不可能都會是有這個bean,那麼需要考慮到子類需要覆蓋或者說重新注入個性化的bean 有三種方法來實現這