一文詳解C++子類函數(shù)為什么不能重載父類函數(shù)
先說結(jié)論:
子類成員函數(shù)的函數(shù)名和基類一樣,但是函數(shù)聲明與基類不一樣的時候,不會和基類函數(shù)構(gòu)成重載,而是會隱藏基類函數(shù)
簡要回顧下C++中的基本概念:
- 重寫(override): 基類函數(shù)帶virtual,子類函數(shù)聲明和基類完全一樣,實現(xiàn)不一樣重
- 載(overload): 同一個類中,函數(shù)名一樣,函數(shù)參數(shù)類型,個數(shù),順序等不一樣的構(gòu)成重載
- 隱藏(hide): 子類函數(shù)名和基類一樣,但是函數(shù)聲明與基類不一樣,就會對基類的函數(shù)進行隱藏
那么,子類函數(shù)名和基類一樣,但是函數(shù)聲明與基類不一樣的時候,為什么不能重載基類函數(shù)呢?
先看
例子一:
#include <stdio.h>
class Base {
public:
virtual void foo(float a) {
printf(" Base :: foo(float) \n");
};
virtual void foo(double a) {
printf(" Base :: foo(double) \n");
};
};
class Derived : public Base {
public:
virtual void foo(double a) {
printf(" Derived :: foo(double) \n");
};
};
int main() {
Derived d;
float a = 3.0f;
d.foo(a);
Base b;
b.foo(a);
}如果重載可以發(fā)生在子類和基類之間,函數(shù)調(diào)用d.foo(a)的最佳匹配應該是Base::foo(float a),而實際輸出是
Derived :: foo(double)
說明float類型的a向上轉(zhuǎn)型為double,調(diào)用了子類的函數(shù),重載沒有在子類和基類間發(fā)生。這里如果類型轉(zhuǎn)換不能發(fā)生,將不能通過編譯。
而b.foo(a)的輸出為:
Base :: foo(float)
這說明重載在單個類內(nèi)部進行。
如果實在想在子類中調(diào)用父類的函數(shù),對于下面的例子二(不能編譯通過):
class A
{
public:
void a() {}
};
class B : public A
{
public:
void a(int) {}
};
int main()
{
B b;
b.a();
}如果需要上面的函數(shù)可以編譯通過,我們可以這樣做:
- 在class B 內(nèi)部加上using A::a
- 調(diào)用時使用b.A::a(),不推薦這樣做
當然,問題的關鍵是為什么C++的設計者這么設計,從技術(shù)實現(xiàn)來說,訪問基類函數(shù)來進行名字查找,實現(xiàn)跨類重載沒有太大的難度。但是從實際用戶意圖來說,像上面B中添加void a(int)函數(shù)的目的就是為了重新實現(xiàn)A的接口,并隱藏原來的接口;當然,如果用戶不想隱藏,可以加上using A::a。
另外,對于例子一,如果實現(xiàn)了跨類重載,那么d.foo(a)將也會調(diào)用到基類的函數(shù),盡管float可以轉(zhuǎn)型到float, 將很容易引起混淆。
順應用戶意圖和避免不必要的混淆,這可能就是C++設計者這么設計的原因。
到此這篇關于一文詳解C++子類函數(shù)為什么不能重載父類函數(shù)的文章就介紹到這了,更多相關C++子類函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
由static_cast和dynamic_cast到C++對象占用內(nèi)存的全面分析
下面小編就為大家?guī)硪黄蓅tatic_cast和dynamic_cast到C++對象占用內(nèi)存的全面分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
Linux?C/C++實現(xiàn)網(wǎng)絡流量分析工具
網(wǎng)絡流量分析的原理基于對數(shù)據(jù)包的捕獲、解析和統(tǒng)計分析,通過對網(wǎng)絡流量的細致觀察和分析,幫助管理員了解和優(yōu)化網(wǎng)絡的性能,本文將通過C++實現(xiàn)網(wǎng)絡流量分析工具,有需要的可以參考下2023-10-10
C++使用easyX庫實現(xiàn)三星環(huán)繞效果流程詳解
EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。這篇文章主要介紹了C++使用easyX庫實現(xiàn)三星環(huán)繞效果,需要的可以參考一下2022-10-10
最短時間學會基于C++實現(xiàn)DFS深度優(yōu)先搜索
常見使用深度優(yōu)先搜索(DFS)以及廣度優(yōu)先搜索(BFS)這兩種搜索,今天我們就來講講什么是深度優(yōu)先搜索,感興趣的可以了解一下2021-08-08
利用C++實現(xiàn)從std::string類型到bool型的轉(zhuǎn)換
利用C++實現(xiàn)從std::string類型到bool型的轉(zhuǎn)換。需要的朋友可以過來參考下。希望對大家有所幫助2013-10-10

