1,父子間的衝突是由繼承帶來的,兩個類之間存在了繼承的關係,必然的會帶來一 些問題,本文要討論的是父子之間成員變數或成員函式的命名問題;
2,思考:
1,子類中是否可以定義父類中的同名成員?
1,可以,本文先程式設計解決這個問題;
2,這個問題就是同名覆蓋問題;
2,如果可以,如何區分?如果不可以,為什麼?
3,同名成員變數程式設計實驗:
1 #include 2 #include 34using
namespace
std;56
class
parent7;
1112
class child : public
parent13;
1718
intmain()
19
4,父子間的衝突(同名覆蓋):
1,子類可以定義父類中的同名成員;
2,子類中的成員將隱藏父類中的同名成員;
1,編譯器認為已經從父類中繼承得到這個成員了,又自定義了乙個同名成員,目的只有乙個,就是你想要自己自定義的同名成員、而不想要從父類那裡繼承得到的同名成員,因此會產生同名覆蓋現象;
3,父類中的同名成員依然存在於子類中;
1,隱藏、不是銷毀;
4,通過作用域分辨符(::)訪問父類中的同名成員;
5,訪問父類中的同名成員方式:
1,child c;
2,c.mi = 100; // 子類中的 mi;
3,c.parent::mi = 1000; // 父類中的 mi;
6,同名成員變數深度分析程式設計實驗:
1 #include 2 #include 34using
namespace
std;56
namespacea7
1011
namespaceb12
1516
class
parent
1725
};26
27class child : public
parent
2836
};37
38int
main()
39
1,父類和子類可以產生同名覆蓋衝突,但是通過作用域分辨符可以解決這個問 題;
7,再論過載:
1,類中的成員函式可以進行過載:
1,過載函式的本質為多個不同的函式;
2,函式名和引數列表是唯一的標識;
3,函式過載必須發生在同乙個作用域中;
8,問題:
1,子類中定義的函式是否能過載父類中的同名函式?
1,將父子間的衝突問題上公升到成員函式了;
9,父子間的函式過載程式設計實驗:
1,繼承父類成員函式,累加父類的同名成員;
1 #include 2 #include 34using
namespace
std;56
class
parent715
16void add(int a, int
b)17
20};
2122
class child : public
parent23;
2728
intmain()
29
2,函式的同名覆蓋:
1 #include 2 #include 34using
namespace
std;56
class
parent715
16void add(int a, int
b)17
20};
2122
class child : public
parent
2331
};32
33int
main()
34
10,父子間的衝突:
1,子類中的函式將隱藏父類的同名函式;
2,子類無法過載父類中的成員函式;
1,因為它們處於不同的作用域;
3,使用作用域分辨符訪問父類中的同名函式;
1,類名加上作用域分辨符;
4,子類可以定義父類中完全相同的成員函式;
1 #include 2 #include 34using
namespace
std;56
class
parent715
16void add(int a, int
b)17
20};
2122
class child : public
parent
2331
32void add(int a, int b) //
同名覆蓋;函式重寫;
3336
37void add(int x, int y, int z) //
過載;38
41};
4243
intmain()
44
11,小結:
1,子類可以定義父類中的同名成員;
2,子類中的成員將隱藏父類中的同名成員;
1,包括同名成員變數和同名成員函式;
2,重寫的依據;
3,這就是同名覆蓋;
3,子類和父類中的函式不能構成過載關係;
1,作用域不同;
4,子類可以定義父類中完全相同的成員函式;
1,作用域不同;
5,使用作用域分辨符訪問父類中的同名成員;
1,父類名加上作用域分辨符;
C 繼承 同名隱藏 覆蓋,虛函式
不同作用域宣告的識別符號的可見性原則 如果存在兩個或多個具有包含關係的作用域,外層宣告了乙個識別符號,而內層沒有再次宣告同名識別符號,那麼外層識別符號在內層依然可見,如果在內層宣告了同名識別符號,則外層識別符號在內層不可見,這時稱內層識別符號隱藏了外層同名識別符號,這種現象稱為隱藏規則。在類的派生層...
c 繼承中同名成員處理
所謂同名成員也就是 子類與父類 變數或者成員函式重名 看看以下 了解訪問方式 1 include2 using namespace std 34 class father512 void fun int x 13 17protected 18 intb 19private 20 intc 21 22...
C 之同名覆蓋 多型
一.同名覆蓋引發的問題 父子間的賦值相容 子類物件可以當作父類物件使用 相容性 1.子類物件可以直接賦值給父類物件 2.子類物件可以直接初始化父類物件 3.父類指標可以指向子類物件 4.父類引用可以直接引用子類物件 示例 include include using namespace std cla...