程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中基類和派生類之間的轉換實例教程

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

編輯:關於C++

C++中基類和派生類之間的轉換實例教程。本站提示廣大學習愛好者:(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、派生類到基類的轉化

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

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

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

2、基類到派生類的轉化

切記:這類轉換有能夠激發嚴重的平安成績,編寫代碼時不要應用。沒有基類到派生類的主動轉換,緣由在於基類對象只能是基類對象,不克不及包括派生類型的成員。

假如許可用基類對象給派生類對象賦值,那末便可以試圖應用該派生類對象拜訪不存在的成員。

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不存在。會湧現嚴重效果。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved