欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談C++ 基類指針和子類指針的相互賦值

 更新時間:2016年12月22日 08:44:31   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談C++ 基類指針和子類指針的相互賦值。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

//============================================================== 
//      animal.h 
// 
// author : zwq 
// describe: 非虛函數(shù)情況下,將子類指針賦給積累指針,驗證最終調(diào)用 
//      基類函數(shù)還是子類函數(shù)。 
//============================================================== 
#ifndef ANIMAL_H 
#define ANIMAL_H 
 
//=============================================================== 
// 
//        animal 
//        動物基類 
// 
//=============================================================== 
class animal 
{ 
public: 
  void breathe();   // 非虛函數(shù) 
}; 
 
//=============================================================== 
// 
//           animal 
//        魚類,集成于動物基類 
// 
//=============================================================== 
class fish : public animal 
{ 
public: 
  void breathe();   // 非虛函數(shù) 
}; 
 
#endif 
#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)將子類指針賦值給基類指針時,不需要進行強制類型轉(zhuǎn)換,C++編譯器將自動進行類型轉(zhuǎn)換。因為子類對象也是一個基類對象。

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

執(zhí)行以下代碼,看看會報什么錯誤:

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

--------------------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)

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

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

再次編譯,通過。

二.子類指針賦給基類指針時內(nèi)存分析

(1)int變量賦給char變量

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

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

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

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

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

// 將基類指針直接賦給子類指針,需要強制轉(zhuǎn)換,C++編譯器不會自動進行類型轉(zhuǎn)換 
// 因為animal對象不是一個fish對象 
fish* fh1; 
animal* an1 = new animal; 
// 進行強制類型轉(zhuǎn)化 
fh1 = (fish*)an1; 

以上就是小編為大家?guī)淼臏\談C++ 基類指針和子類指針的相互賦值全部內(nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • C++?Qt實現(xiàn)動態(tài)增加垂直滾動條

    C++?Qt實現(xiàn)動態(tài)增加垂直滾動條

    本博文源于筆者正在工作的一個小內(nèi)容,內(nèi)容涉及到為qt動態(tài)增加垂直滾動條,文章分為三個部分,問題起源,問題解決方案,問題解決成功效果,思路清晰,文章干貨滿滿,復(fù)制源碼即可使用,需要的朋友可以參考下
    2023-08-08
  • C++ 匈牙利算法案例分析詳解

    C++ 匈牙利算法案例分析詳解

    這篇文章主要介紹了C++ 匈牙利算法案例分析詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言中實現(xiàn)itoa函數(shù)的實例

    C語言中實現(xiàn)itoa函數(shù)的實例

    這篇文章主要介紹了C語言中實現(xiàn)itoa函數(shù)的實例的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • 詳解C++中typedef 和 #define 的區(qū)別

    詳解C++中typedef 和 #define 的區(qū)別

    這篇文章主要介紹了C++中typedef 與 #define 的區(qū)別,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++實現(xiàn)基于EASYX庫掃描線算法

    C++實現(xiàn)基于EASYX庫掃描線算法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)基于EASYX庫掃描線算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++使用tinyxml庫處理XML文件

    C++使用tinyxml庫處理XML文件

    TinyXML是一個開源的解析XML的解析庫,能夠用于C++,能夠在Windows或Linux中編譯,這個解析庫的模型通過解析XML文件,然后在內(nèi)存中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹,本文為大家介紹的是使用tinyxml庫處理XML文件,需要的可以參考一下
    2023-07-07
  • C++圖像加載之libpng、FreeImage、stb_image詳解

    C++圖像加載之libpng、FreeImage、stb_image詳解

    libpng、FreeImage、stb_image都是圖像解析的開源庫,這篇文章主要為大家詳細介紹了這三者的使用方法,文中的示例代碼講解詳細,需要的可以參考一下
    2023-06-06
  • c++ 虛繼承,多繼承相關(guān)總結(jié)

    c++ 虛繼承,多繼承相關(guān)總結(jié)

    這篇文章主要介紹了c++虛繼承,多繼承相關(guān)總結(jié),幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下
    2021-03-03
  • C語言 常量,變量及數(shù)據(jù)詳細介紹

    C語言 常量,變量及數(shù)據(jù)詳細介紹

    這篇文章主要介紹了C語言 常量,變量及數(shù)據(jù)詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • C++語言實現(xiàn)拼圖游戲詳解

    C++語言實現(xiàn)拼圖游戲詳解

    這篇文章主要為大家詳細介紹了C++基于EasyX庫實現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論