日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基类指针和子类指针相互赋值

發布時間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基类指针和子类指针相互赋值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先,給出基類animal和子類fish

[cpp] view plaincopy print?
  • //==============================================================??
  • //???????????animal.h??
  • //??
  • //?begin???:?2012-06-30??
  • //?author??:?zwq??
  • //?describe:?非虛函數情況下,將子類指針賦給積累指針,驗證最終調用??
  • //???????????基類函數還是子類函數。??
  • //==============================================================??
  • #ifndef?ANIMAL_H??
  • #define?ANIMAL_H??
  • ??
  • //===============================================================??
  • //??
  • //????????????????animal??
  • //???????????????動物基類??
  • //??
  • //===============================================================??
  • class?animal??
  • {??
  • public:??
  • ????void?breathe();?????//?非虛函數??
  • };??
  • ??
  • //===============================================================??
  • //??
  • //?????????????????????animal??
  • //???????????????魚類,集成于動物基類??
  • //??
  • //===============================================================??
  • class?fish?:?public?animal??
  • {??
  • public:??
  • ????void?breathe();?????//?非虛函數??
  • };??
  • ??
  • #endif??
  • //============================================================== // animal.h // // begin : 2012-06-30 // author : zwq // describe: 非虛函數情況下,將子類指針賦給積累指針,驗證最終調用 // 基類函數還是子類函數。 //============================================================== #ifndef ANIMAL_H #define ANIMAL_H//=============================================================== // // animal // 動物基類 // //=============================================================== class animal { public:void breathe(); // 非虛函數 };//=============================================================== // // animal // 魚類,集成于動物基類 // //=============================================================== class fish : public animal { public:void breathe(); // 非虛函數 };#endif
    [cpp] view plaincopy print?
  • #include?"StdAfx.h"??
  • #include?<iostream>??
  • #include?"Animal.h"??
  • ??
  • using?namespace?std;??
  • ??
  • //===============================================================??
  • //??
  • //????????????????animal??
  • //???????????????動物基類??
  • //??
  • //===============================================================??
  • ??
  • void?animal::breathe()??
  • {??
  • ????cout?<<?"animal?breathe"?<<?endl;??
  • }??
  • ??
  • //===============================================================??
  • //??
  • //?????????????????????animal??
  • //???????????????魚類,集成于動物基類??
  • //??
  • //===============================================================??
  • ??
  • void?fish::breathe()??
  • {??
  • ????cout?<<?"fish?bubble"?<<?endl;??
  • }??
  • #include "StdAfx.h" #include <iostream> #include "Animal.h"using namespace std;//=============================================================== // // animal // 動物基類 // //===============================================================void animal::breathe() {cout << "animal breathe" << endl; }//=============================================================== // // animal // 魚類,集成于動物基類 // //===============================================================void fish::breathe() {cout << "fish bubble" << endl; }

    一.基類指針和子類指針之間相互賦值
    (1)將子類指針賦值給基類指針時,不需要進行強制類型轉換,C++編譯器將自動進行類型轉換。因為子類對象也是一個基類對象。

    (2)將基類指針賦值給子類指針時,需要進行強制類型轉換,C++編譯器將不自動進行類型轉換。因為基類對象不是一個子類對象。子類對象的自增部分是基類不具有的。

    執行以下代碼,看看會報什么錯誤:

    [cpp] view plaincopy print?
  • int?main(int?argc,?char*?argv[])??
  • {??
  • ????ExamAnimal();??
  • ??
  • ????return?0;??
  • }??
  • ??
  • void?ExamAnimal()??
  • {??
  • ????//?將子類指針直接賦給基類指針,不需要強制轉換,C++編譯器自動進行類型轉換??
  • ????//?因為fish對象也是一個animal對象??
  • ????animal*?pAn;??
  • ????fish*?pfh?=?new?fish;??
  • ????pAn?=?pfh;??
  • ??????
  • ????delete?pfh;??
  • ????pfh?=?NULL;??
  • ??????
  • ????//?將基類指針直接賦給子類指針,需要強制轉換,C++編譯器不會自動進行類型轉換??
  • ????//?因為animal對象不是一個fish對象??
  • ????fish*?fh1;??
  • ????animal*?an1?=?new?animal;??
  • ????//?沒有進行強制類型轉化??
  • ????fh1?=?an1;??
  • ??
  • ????delete?an1;??
  • ????an1?=?NULL;??
  • }??
  • int main(int argc, char* argv[]) {ExamAnimal();return 0; }void ExamAnimal() {// 將子類指針直接賦給基類指針,不需要強制轉換,C++編譯器自動進行類型轉換// 因為fish對象也是一個animal對象animal* pAn;fish* pfh = new fish;pAn = pfh;delete pfh;pfh = NULL;// 將基類指針直接賦給子類指針,需要強制轉換,C++編譯器不會自動進行類型轉換// 因為animal對象不是一個fish對象fish* fh1;animal* an1 = new animal;// 沒有進行強制類型轉化fh1 = an1;delete an1;an1 = NULL; }

    編譯時,報如下錯誤信息:

    --------------------Configuration: CPlusPlusPrimer - Win32 Debug--------------------
    Compiling...
    CPlusPlusPrimer.cpp
    E:\Study\example\CPlusPlusPrimer\CPlusPlusPrimer.cpp(94) : error C2440: '=' : cannot convert from 'class animal *' to 'class fish *'
    ? ? ? ? Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    Error executing cl.exe.

    CPlusPlusPrimer.exe - 1 error(s), 0 warning(s)

    根據以上錯題提示信息,對代碼做如下修改:

    [cpp] view plaincopy print?
  • void?ExamAnimal()??
  • {??
  • ????//?將子類指針直接賦給基類指針,不需要強制轉換,C++編譯器自動進行類型轉換??
  • ????//?因為fish對象也是一個animal對象??
  • ????animal*?pAn;??
  • ????fish*?pfh?=?new?fish;??
  • ????pAn?=?pfh;??
  • ??????
  • ????delete?pfh;??
  • ????pfh?=?NULL;??
  • ??????
  • ????//?將基類指針直接賦給子類指針,需要強制轉換,C++編譯器不會自動進行類型轉換??
  • ????//?因為animal對象不是一個fish對象??
  • ????fish*?fh1;??
  • ????animal*?an1?=?new?animal;??
  • ????//?修改處:??
  • ????//?進行強制類型轉化??
  • ????fh1?=?(fish*)an1;??
  • ??
  • ????delete?an1;??
  • ????an1?=?NULL;??
  • }??
  • void ExamAnimal() {// 將子類指針直接賦給基類指針,不需要強制轉換,C++編譯器自動進行類型轉換// 因為fish對象也是一個animal對象animal* pAn;fish* pfh = new fish;pAn = pfh;delete pfh;pfh = NULL;// 將基類指針直接賦給子類指針,需要強制轉換,C++編譯器不會自動進行類型轉換// 因為animal對象不是一個fish對象fish* fh1;animal* an1 = new animal;// 修改處:// 進行強制類型轉化fh1 = (fish*)an1;delete an1;an1 = NULL; }

    再次編譯,通過。

    二.子類指針賦給基類指針時內存分析
    (1)int變量賦給char變量


    整型int轉換為char類型時,只有一個字節的內容能夠放進char類型,剩下的三個字節內容放不下,被截掉,丟失精度。
    兩個變量或者對象進行轉換時,一定要看兩者的內存模型是否互相匹配。

    (2)子類fish指針賦給基類animal指針

    下面看看子類fish指針賦給基類animal指針時,內存的變化:
    當我們構造fish類的對象時,首先要調用animal類的構造函數去構造animal類的構造函數,然后才調用fish類的構造函數完成自身部分的構造,從而拼接出一個完整的fish對象。當我們將fish類對象轉換為animal類對象時,該對象就被認為是原對象整個內存模型的上半部分,也就是圖中animal對象的內存部分。當我們利用類型轉換后的對象指針去調用它的方法時,自然是調用它所在的內存中的方法。
    在這里,animal類對象類似于char類型的對象,fish類對象類似于int類型的對象,將fish類對象賦給animal類對象時,會截取fish類對象自身的部分,剩下fish類對象中的animal部分。

    (2)基類animal指針賦給子類fish指針

    基類animal對象包含的信息少,類fish對象包含的信息多,將信息少的對象直接轉換為信息多的對象時(沒有強制類型轉換),顯然是無法構造出多出的信息。在編譯時,也會發生如下錯誤:error C2440: '=' : cannot convert from 'class animal *' to 'class fish *'。
    這時,需要做強制類型轉換:

    [cpp] view plaincopy print?
  • //?將基類指針直接賦給子類指針,需要強制轉換,C++編譯器不會自動進行類型轉換??
  • //?因為animal對象不是一個fish對象??
  • fish*?fh1;??
  • animal*?an1?=?new?animal;??
  • //?進行強制類型轉化??
  • fh1?=?(fish*)an1;??
  • 總結

    以上是生活随笔為你收集整理的基类指针和子类指针相互赋值的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。