欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目: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();    //出現(xiàn)安全問題,p無法訪問,因為a中沒有p成員
  system("pause");
  return 0;
}

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

一、派生類到基類的轉化

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為基類指針,指向派生類對象是合法的,因為派生類對象也是基類對象。語句會輸出派生類對象中基類部分。

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

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

編譯時編譯器能知道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.派生類對象賦值給基類引用

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

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

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

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

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

二、基類到派生類的轉化

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

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

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();    //出現(xiàn)安全問題,p無法訪問,因為a中沒有p成員

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

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

上一篇:C++類中的static和const用法實例教程

欄    目:C語言

下一篇:16種C語言編譯警告(Warning)類型的解決方法

本文標題:C++中基類和派生類之間的轉換實例教程

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3456.html

網(wǎng)頁制作CMS教程網(wǎng)絡編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權所有