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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++继承中父类和子类之间的赋值兼容

發(fā)布時(shí)間:2025/4/5 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++继承中父类和子类之间的赋值兼容 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1 C++繼承中父類和子類之間的賦值兼容
      • 1.1 父子間的賦值兼容
      • 1.2 特殊的同名函數(shù)

1 C++繼承中父類和子類之間的賦值兼容

1.1 父子間的賦值兼容

在公有繼承的條件下,子類對(duì)象可以當(dāng)作父類對(duì)象使用(兼容性):

  • 子類對(duì)象可以直接賦值給父類對(duì)象。
  • 子類對(duì)象可以直接初始化父類對(duì)象。
  • 父類指針可以直接指向子類對(duì)象。
  • 父類引用可以直接引用子類對(duì)象。

在公有繼承的條件下,子類也被稱為父類的子類型。這種子類型關(guān)系具有單向傳遞性。

子類型的作用:

  • 在需要父類對(duì)象的任何地方, 可以使用”公有派生”的子類的對(duì)象來替代,從而可以使用相同的函數(shù)統(tǒng)一處理基類對(duì)象和公有派生類對(duì)象即:形參為基類對(duì)象時(shí),實(shí)參可以是派生類對(duì)象。

子類對(duì)象的兼容性:

#include <iostream> #include <string>using namespace std;class Parent { public:int mi;void add(int i){mi += i;}void add(int a, int b){mi += (a + b);} };class Child : public Parent { public:int mv;void add(int x, int y, int z){mv += (x + y + z);} };int main() {Parent p;Child c;p = c;Parent p1(c);Parent& rp = c;Parent* pp = &c;rp.mi = 100;rp.add(5); // 沒有發(fā)生同名覆蓋?rp.add(10, 10); // 沒有發(fā)生同名覆蓋?/* 為什么編譯不過? */// pp->mv = 1000;// pp->add(1, 10, 100);return 0; }

當(dāng)使用父類指針(引用)指向子類對(duì)象時(shí):

  • 子類對(duì)象退化為父類對(duì)象。
  • 只能訪問父類中定義的成員。
  • 可以直接訪問被子類覆蓋的同名成員。

1.2 特殊的同名函數(shù)

特殊的同名函數(shù):

  • 子類中可以重定義父類中已經(jīng)存在的成員函數(shù)。
  • 這種重定義發(fā)生在繼承中,叫做函數(shù)重寫。
  • 函數(shù)重寫是同名覆蓋的一種特殊情況。


思考一下:當(dāng)函數(shù)重寫遇上賦值兼容會(huì)發(fā)生什么?

賦值兼容的問題:

#include <iostream> #include <string>using namespace std;class Parent { public:int mi;void add(int i){mi += i;}void add(int a, int b){mi += (a + b);}void print(){cout << "I'm Parent." << endl;} };class Child : public Parent { public:int mv;void add(int x, int y, int z){mv += (x + y + z);}void print(){cout << "I'm Child." << endl;} };void how_to_print(Parent* p) {p->print(); }int main() {Parent p;Child c;how_to_print(&p); // Expected to print: I'm Parent.how_to_print(&c); // Expected to print: I'm Child.return 0; }

問題分析:

  • 編譯期間,編譯器只能根據(jù)指針的類型判斷所指向的對(duì)象。
  • 根據(jù)賦值兼容,編譯器認(rèn)為父類指針指向的是父類對(duì)象。
  • 因此,編譯結(jié)果只可能是調(diào)用父類中定義的同名函數(shù)。


在編譯這個(gè)函數(shù)的時(shí)候,編譯器不可能知道p究竟指向了什么。但是編譯器沒有理由報(bào)錯(cuò),于是編譯器人為最安全的做法就是調(diào)用父類的print函數(shù),因?yàn)楦割惡妥宇惪隙ǘ加邢嗤膒rint函數(shù)。

編譯器的處理方法雖然是合理的,但并不是期望的。為了解決這個(gè)問題,需要引入多態(tài)。


參考資料:

  • C++深度解析教程
  • C/C++從入門到精通-高級(jí)程序員之路【奇牛學(xué)院】
  • 總結(jié)

    以上是生活随笔為你收集整理的C++继承中父类和子类之间的赋值兼容的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。