最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2014年08月23日 10:07:20   投稿:shichen2014  
這篇文章主要介紹了C++中基類和派生類之間的轉(zhuǎn)換,有助于深入理解C++面向?qū)ο蟪绦蛟O(shè)計(jì),需要的朋友可以參考下

本文實(shí)例講解了C++中基類和派生類之間的轉(zhuǎn)換。對(duì)于深入理解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;       //錯(cuò)誤。派生類指針不能指向基類對(duì)象。

//  print1(b);
//  print2(a);      //錯(cuò)誤。不能用基類對(duì)象給派生類引用賦值。
//  print3(b);
//  print4(a);      //錯(cuò)誤。不能用基類對(duì)象給派生類對(duì)象賦值。

//  pb = pa;       //不能用基類指針給派生類指針賦值。

  pb = (B*)pa;     //可以強(qiáng)制轉(zhuǎn)換,但是非常不安全。
  pb->display();    //出現(xiàn)安全問題,p無法訪問,因?yàn)閍中沒有p成員
  system("pause");
  return 0;
}

切記:派生類對(duì)象是基類對(duì)象,派生類中包含有基類的成員?;悓?duì)象不是派生類對(duì)象,它不能包含派生類型的成員。

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

1.派生類對(duì)象地址賦值給基類指針

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

pa為基類指針,指向派生類對(duì)象是合法的,因?yàn)榕缮悓?duì)象也是基類對(duì)象。語句會(huì)輸出派生類對(duì)象中基類部分。

注意:這里并不會(huì)調(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)性。之后的文章會(huì)講到。

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

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

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

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

2.派生類對(duì)象賦值給基類引用

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

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

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

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

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

3.派生類對(duì)象賦值給基類對(duì)象。

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

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

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

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

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

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

A a(3, 4);
B b(10, 20, 30);
A * pa;
B * pb;
//  print2(a);      //錯(cuò)誤。不能用基類對(duì)象給派生類引用賦值。
//  print4(a);      //錯(cuò)誤。不能用基類對(duì)象給派生類對(duì)象賦值。
//  pb = &a;       //錯(cuò)誤。派生類指針不能指向基類對(duì)象。

pa = &a;
pb = &b;

//pb = pa;           //錯(cuò)誤。不能用基類指針給派生類指針賦值。

pb = (B*)pa;     //可以強(qiáng)制轉(zhuǎn)換,但是非常不安全。
pb->display();    //出現(xiàn)安全問題,p無法訪問,因?yàn)閍中沒有p成員

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

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

相關(guān)文章

  • C++的輸入與輸出和格式化輸出

    C++的輸入與輸出和格式化輸出

    這篇文章主要介紹了詳解C++中的輸入與輸出和格式化輸出,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考,希望能夠給你帶來幫助
    2021-11-11
  • Qt自定義控件實(shí)現(xiàn)線條型加載條

    Qt自定義控件實(shí)現(xiàn)線條型加載條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)線條型加載條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++中String類型的逆序方式

    C++中String類型的逆序方式

    這篇文章主要介紹了C++中String類型的逆序方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • EasyC++自動(dòng)存儲(chǔ)持續(xù)性

    EasyC++自動(dòng)存儲(chǔ)持續(xù)性

    這篇文章主要介紹了EasyC++自動(dòng)存儲(chǔ)持續(xù)性,下面文章圍繞EasyC++自動(dòng)存儲(chǔ)持續(xù)性的相關(guān)資料展開全文資料,需要的小伙伴可以參考一下下面文章的具體內(nèi)容,希望對(duì)你的學(xué)習(xí)有所幫助
    2021-12-12
  • 詳解C++編程中的文件流與字符串流

    詳解C++編程中的文件流與字符串流

    這篇文章主要介紹了C++編程中的文件流與字符串流,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++實(shí)現(xiàn)LeetCode(2.兩個(gè)數(shù)字相加)

    C++實(shí)現(xiàn)LeetCode(2.兩個(gè)數(shù)字相加)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(兩個(gè)數(shù)字相加),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt使用QPainter實(shí)現(xiàn)自定義圓形進(jìn)度條

    Qt使用QPainter實(shí)現(xiàn)自定義圓形進(jìn)度條

    這篇文章主要介紹了Qt如何使用QPainter實(shí)現(xiàn)自定義圓形進(jìn)度條功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下
    2022-06-06
  • 詳細(xì)理解函C語言的函數(shù)棧幀

    詳細(xì)理解函C語言的函數(shù)棧幀

    這篇文章主要為大家介紹了C語言的函數(shù)棧幀,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助
    2021-11-11
  • C語言長字符串的換行方法詳解

    C語言長字符串的換行方法詳解

    在編寫C程序時(shí),如果想要打印某個(gè)字符串,而字符串的內(nèi)容比較多,這就涉及到對(duì)這個(gè)長字符串進(jìn)行書寫換行,本片文章就帶你了解一下
    2021-09-09
  • C++實(shí)現(xiàn)廣度優(yōu)先搜索實(shí)例

    C++實(shí)現(xiàn)廣度優(yōu)先搜索實(shí)例

    這篇文章主要介紹了C++實(shí)現(xiàn)廣度優(yōu)先搜索,對(duì)于C++程序員來說非常有借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

灵寿县| 辉县市| 东丽区| 安康市| 嘉兴市| 恭城| 防城港市| 青阳县| 江川县| 吉木乃县| 镇雄县| 丰县| 南康市| 安龙县| 华蓥市| 鄂伦春自治旗| 江都市| 凤台县| 铜川市| 太和县| 博湖县| 无锡市| 阿拉善右旗| 成武县| 大石桥市| 瑞安市| 屏南县| 新河县| 格尔木市| 保亭| 日土县| 南陵县| 荥阳市| 张家川| 淄博市| 无锡市| 简阳市| 南开区| 济阳县| 宣恩县| 辽阳县|