国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++中基類和派生類之間的轉(zhuǎn)換實(shí)例教程

2020-01-26 15:22:39
字體:
供稿:網(wǎng)友

本文實(shí)例講解了C++中基類和派生類之間的轉(zhuǎn)換。對于深入理解C++面向?qū)ο蟪绦蛟O(shè)計(jì)有一定的幫助作用。此處需要注意:本文實(shí)例講解內(nèi)容的前提是派生類繼承基類的方式是公有繼承,關(guān)鍵字public。具體分析如下:

以下程序?yàn)橹v解示例:

#include<iostream>using namespace std;class A{public:  A(int m1, int n1):m(m1), n(n1){}  void display();private:  int m;  int n;};void A::display(){  cout << "m = " << m << endl;  cout << "n = " << n << endl;}class B :public A{public:  B(int m1, int n1, int p1) :A(m1, n1), p(p1){}  void display();private:  int p;};void B::display(){  A::display();  cout << "p = " << p << endl;}void print1(A& a){  a.display();}void print2(B& b){  b.display();}void print3(A a){  a.display();}void print4(B b){  b.display();}int main(){  A a(3, 4);//  a.display();  B b(10, 20, 30);//  b.display();  A * pa;  B * pb;  pa = &a;//  pa->display();  pb = &b;//  pb->display();//  pa = &b;//  pa->display();//  pb = &a;       //錯誤。派生類指針不能指向基類對象。//  print1(b);//  print2(a);      //錯誤。不能用基類對象給派生類引用賦值。//  print3(b);//  print4(a);      //錯誤。不能用基類對象給派生類對象賦值。//  pb = pa;       //不能用基類指針給派生類指針賦值。  pb = (B*)pa;     //可以強(qiáng)制轉(zhuǎn)換,但是非常不安全。  pb->display();    //出現(xiàn)安全問題,p無法訪問,因?yàn)閍中沒有p成員  system("pause");  return 0;}

切記:派生類對象是基類對象,派生類中包含有基類的成員。基類對象不是派生類對象,它不能包含派生類型的成員。

一、派生類到基類的轉(zhuǎn)化

1.派生類對象地址賦值給基類指針

main函數(shù)中執(zhí)行以下代碼

A a(3, 4);//  a.display();  B b(10, 20, 30);//  b.display();  A * pa;//  B * pb;//  pa = &a;//  pa->display();//  pb = &b;//  pb->display();  pa = &b;  pa->display();     //會輸出 10 20

pa為基類指針,指向派生類對象是合法的,因?yàn)榕缮悓ο笠彩腔悓ο蟆UZ句會輸出派生類對象中基類部分。

注意:這里并不會調(diào)用派生類的display函數(shù),調(diào)用的是基類的display函數(shù),因?yàn)橹羔榩a是基類指針,編譯器在編譯階段只知道pa的類型。如果要實(shí)現(xiàn)調(diào)用派生類的display函數(shù),需要用到虛函數(shù)實(shí)現(xiàn)多態(tài)性。之后的文章會講到。

進(jìn)一步解釋一下編譯時(shí)和運(yùn)行時(shí)的區(qū)別。

編譯時(shí)編譯器能知道pa的類型為A *,但是不知道它指向了哪個(gè)對象,假如有以下語句

A a(3, 4);B b(10, 20, 30);A* pa;int number;cin >> number;if (number >= 0)  pa = &a;else  pa = &b;

pa指向的對象類型依賴于輸入,運(yùn)行時(shí)才輸入,所以編譯器是沒有辦法知道pa指向哪個(gè)類型的。

2.派生類對象賦值給基類引用

引用跟指針基本沒有區(qū)別,引用本質(zhì)上是指針,是個(gè)指針常量,具體可以參照我的另一篇C++中的引用和指針的聯(lián)系和區(qū)別

main函數(shù)中執(zhí)行以下代碼

A a(3, 4);B b(10, 20, 30);print1(b);      //會輸出 10 20

形參為基類引用,實(shí)參為派生類對象,派生類對象也是基類對象,可以賦值給基類引用。輸出派生類中基類部分。

注意:此時(shí)對象本身并未復(fù)制,b仍然是派生類對象,前面說過了引用就是一個(gè)指針

3.派生類對象賦值給基類對象。

A a(3, 4);B b(10, 20, 30);print3(b);

派生類對象基類部分被復(fù)制給形參。

注意:實(shí)際上沒有從派生類對象到基類對象的直接轉(zhuǎn)換。對基類對象的賦值或初始化,實(shí)際上在調(diào)用函數(shù),初始化時(shí)調(diào)用構(gòu)造函數(shù),賦值時(shí)調(diào)用賦值操作符。

二、基類到派生類的轉(zhuǎn)化

切記:這種轉(zhuǎn)換有可能引發(fā)嚴(yán)重的安全問題,編寫代碼時(shí)不要使用。沒有基類到派生類的自動轉(zhuǎn)換,原因在于基類對象只能是基類對象,不能包含派生類型的成員

如果允許用基類對象給派生類對象賦值,那么就可以試圖使用該派生類對象訪問不存在的成員。

A a(3, 4);B b(10, 20, 30);A * pa;B * pb;//  print2(a);      //錯誤。不能用基類對象給派生類引用賦值。//  print4(a);      //錯誤。不能用基類對象給派生類對象賦值。//  pb = &a;       //錯誤。派生類指針不能指向基類對象。pa = &a;pb = &b;//pb = pa;           //錯誤。不能用基類指針給派生類指針賦值。pb = (B*)pa;     //可以強(qiáng)制轉(zhuǎn)換,但是非常不安全。pb->display();    //出現(xiàn)安全問題,p無法訪問,因?yàn)閍中沒有p成員

注意到我們使用強(qiáng)制轉(zhuǎn)換時(shí),當(dāng)派生類添加了基類中不存在的成員時(shí),會出現(xiàn)安全問題。

pb->display();會調(diào)用派生類的display函數(shù),但是它指向的內(nèi)存是基類對象a的內(nèi)存,p不存在。會出現(xiàn)嚴(yán)重后果。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临海市| 达日县| 鄱阳县| 玉山县| 红河县| 通许县| 固安县| 高雄县| 上蔡县| 茌平县| 桂东县| 夏邑县| 丹寨县| 得荣县| 崇阳县| 肥城市| 宣城市| 万年县| 永善县| 潮州市| 吉安市| 山阳县| 搜索| 额尔古纳市| 青浦区| 黎川县| 灵川县| 松溪县| 新宁县| 梁山县| 石家庄市| 长兴县| 文成县| 南木林县| 平顺县| 三亚市| 黑水县| 斗六市| 刚察县| 六枝特区| 明星|