亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

C++中基類和派生類之間的轉換實例教程

2020-05-23 14:21:53
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++中基類和派生類之間的轉換,有助于深入理解C++面向對象程序設計,需要的朋友可以參考下
 
 

本文實例講解了C++中基類和派生類之間的轉換。對于深入理解C++面向對象程序設計有一定的幫助作用。此處需要注意:本文實例講解內容的前提是派生類繼承基類的方式是公有繼承,關鍵字public。具體分析如下:

以下程序為講解示例:

#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;     //可以強制轉換,但是非常不安全。  pb->display();    //出現安全問題,p無法訪問,因為a中沒有p成員  system("pause");  return 0;}

切記:派生類對象是基類對象,派生類中包含有基類的成員?;悓ο蟛皇桥缮悓ο?,它不能包含派生類型的成員。

一、派生類到基類的轉化

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

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();     //會輸出 10 20

pa為基類指針,指向派生類對象是合法的,因為派生類對象也是基類對象。語句會輸出派生類對象中基類部分。

注意:這里并不會調用派生類的display函數,調用的是基類的display函數,因為指針pa是基類指針,編譯器在編譯階段只知道pa的類型。如果要實現調用派生類的display函數,需要用到虛函數實現多態性。之后的文章會講到。

進一步解釋一下編譯時和運行時的區別。

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

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

pa指向的對象類型依賴于輸入,運行時才輸入,所以編譯器是沒有辦法知道pa指向哪個類型的。

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

引用跟指針基本沒有區別,引用本質上是指針,是個指針常量,具體可以參照我的另一篇C++中的引用和指針的聯系和區別

main函數中執行以下代碼

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

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

注意:此時對象本身并未復制,b仍然是派生類對象,前面說過了引用就是一個指針。

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

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

派生類對象基類部分被復制給形參。

注意:實際上沒有從派生類對象到基類對象的直接轉換。對基類對象的賦值或初始化,實際上在調用函數,初始化時調用構造函數,賦值時調用賦值操作符。

二、基類到派生類的轉化

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

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

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;     //可以強制轉換,但是非常不安全。pb->display();    //出現安全問題,p無法訪問,因為a中沒有p成員

注意到我們使用強制轉換時,當派生類添加了基類中不存在的成員時,會出現安全問題。

pb->display();會調用派生類的display函數,但是它指向的內存是基類對象a的內存,p不存在。會出現嚴重后果。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕欧美精品在线| 欧美综合第一页| 成人做爰www免费看视频网站| 欧美精品一区二区三区国产精品| 最新国产精品亚洲| 国产精品av免费在线观看| 亚洲国产又黄又爽女人高潮的| 久久久久中文字幕2018| 亚洲理论在线a中文字幕| 久久五月天色综合| 97久久久免费福利网址| 国产精品爽爽爽| 日韩欧美在线国产| 国产精品高潮呻吟久久av野狼| 欧美高清不卡在线| 色综合亚洲精品激情狠狠| 日韩在线观看免费高清完整版| 精品视频偷偷看在线观看| 欧美在线一级va免费观看| 国产精品久久久久久av| 青草青草久热精品视频在线网站| 精品视频在线播放色网色视频| 国产主播喷水一区二区| 亚洲free性xxxx护士hd| 91视频8mav| 国产日韩欧美在线播放| 日韩欧美国产高清91| 国产91精品久久久| 亚洲三级 欧美三级| 中文字幕一区二区三区电影| 性夜试看影院91社区| 久久久免费电影| 亚洲第一福利在线观看| 欧美日韩加勒比精品一区| 国模吧一区二区三区| 亚洲国产欧美一区二区三区久久| 韩剧1988在线观看免费完整版| 国产一区二区三区视频免费| 欧美在线一区二区三区四| 日韩欧美国产一区二区| 久久久久久高潮国产精品视| 国产精品久久9| 欧美激情久久久| 精品亚洲精品福利线在观看| 视频在线观看99| 亚洲国产欧美久久| 91精品国产综合久久男男| 亚洲无限乱码一二三四麻| www.亚洲天堂| 成人黄色免费看| 91精品国产综合久久久久久久久| 亚洲第五色综合网| 九九热精品视频在线播放| 久久精品中文字幕电影| 日韩不卡在线观看| 亚洲精品美女久久| 按摩亚洲人久久| 日韩美女免费线视频| 欧美与欧洲交xxxx免费观看| 综合国产在线视频| 欧美日韩久久久久| 在线看欧美日韩| 中文字幕不卡在线视频极品| 国产一区二区三区久久精品| 亚洲最大av网站| 91影视免费在线观看| 久久久久久97| 国产精品视频一区国模私拍| 久久大大胆人体| 亚洲人成电影网站色xx| 一区二区亚洲精品国产| 韩国视频理论视频久久| 亚洲一区二区三区sesese| 成人激情视频小说免费下载| 精品一区二区三区电影| 国产日韩欧美日韩大片| 国产精品女主播视频| 久久精品国产免费观看| 久久av红桃一区二区小说| 日韩av中文字幕在线免费观看| 97久久精品人搡人人玩| 国产成人+综合亚洲+天堂| 久久久久久久999精品视频| 亚洲精品综合久久中文字幕| 国产又爽又黄的激情精品视频| 亚洲欧美日本伦理| 日本乱人伦a精品| 欧美一级视频免费在线观看| 欧美成年人视频| 国产啪精品视频| 欧美在线欧美在线| 欧美中文在线观看国产| 久久色免费在线视频| 久久97久久97精品免视看| 国产精品成人aaaaa网站| 欧美激情在线观看视频| 欧日韩在线观看| 日韩欧美亚洲范冰冰与中字| 亚洲男人第一网站| 亚洲精品福利在线| 成人免费看黄网站| 精品一区二区三区电影| 久久久精品国产一区二区| 亚洲最大福利网| 久久综合电影一区| 国产精品免费视频xxxx| 91九色在线视频| 精品国产一区二区三区久久狼5月| 91丝袜美腿美女视频网站| 亚洲大尺度美女在线| 欧美专区中文字幕| 亚洲色图综合久久| 成年无码av片在线| 91精品视频在线| 精品国产91久久久久久老师| 久久综合九色九九| 精品久久久久久久久久国产| 日本国产精品视频| 一区二区亚洲欧洲国产日韩| 亚洲图片欧美午夜| 国产精品劲爆视频| 日韩电影在线观看免费| 久久6免费高清热精品| 亚洲国产精品久久| 国产成人在线视频| 成人写真视频福利网| 日本国产一区二区三区| 成人美女免费网站视频| 懂色aⅴ精品一区二区三区蜜月| 国产精品69久久| 久久精品2019中文字幕| 国产69精品久久久久9| 久久久久久久网站| 2019中文字幕全在线观看| 国产亚洲精品日韩| 中文字幕在线看视频国产欧美在线看完整| 国产日韩在线观看av| 91亚洲精品在线观看| 日韩一区二区av| 98精品国产自产在线观看| 国产精品视频大全| 欧美日韩国产色| 国产z一区二区三区| 欧美激情第6页| 亚洲精品成人av| 亚洲3p在线观看| 51久久精品夜色国产麻豆| 欧美电影在线观看网站| 久久九九精品99国产精品| 国产精品久久久久久久午夜| 亚洲第一网站免费视频| 午夜精品蜜臀一区二区三区免费| 人九九综合九九宗合| 中文字幕免费精品一区高清| 日韩成人网免费视频| 91九色单男在线观看| 亲爱的老师9免费观看全集电视剧| 久久人人爽人人爽爽久久| 在线播放精品一区二区三区| 欧美日韩成人网| 亚洲а∨天堂久久精品9966| 2018国产精品视频| 在线国产精品播放| 欧美激情videoshd|