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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++与Java多态的区别

發布時間:2024/4/14 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++与Java多态的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多態是指用父指針指向不同子類對象時,調用其共有的函數,不同的子類會有不同的行為。雖然C++和Java都具有多態機制,但是他們的實現不同,使用時的效果也會略有不同。

在C++中

  • 普通函數調用:具體調用哪個方法在編譯時就可以決定(通過查找編譯器的符號表),同時在使用標準過程調用機制基礎上增加一個表示對象身份的指針(this指針)。
  • 虛函數調用:函數調用依賴于對象的實際類型,一般地說,對象的實際類型只能在運行時間才能確定。實現機制是使用virtual table(vtbls)和virtual table pointers(vptrs)。
  • vtbl 是由函數指針構成的數組或鏈表,程序中每一個class凡聲明(或繼承)虛函數者,都有一個自己的vtbl,其中的條目就是該class的各個虛函數實現的指針。因此必須為每一個class消耗一個vtbl空間,其大小視虛函數的個數確定。
  • 凡聲明有虛函數的class,其對象都有一個隱藏的data member,用來指向class的vtbl。
  • 當多態發生時,編譯器首先根據對象vptr找出其vtbl,然后找出vtbl內對應的函數指針,最后調用函數指針指向的函數。從而實現多態。

在Java中

1.C++中VTable和vptr是在編譯階段由編譯器自動生成的,也就是說,在C++程序載入內存以前,在.obj(.o)文件中已經有這些結構的信 息;Java中的方法表是由JVM生成的,因此,使用javac命令編譯后生成的.class文件中并沒有方法表的信息。只有等JVM把.class文件 載入到內存中時,才會為該.class文件動態生成一個與之關聯的方法表,放置在JVM的方法區中。
2. C++中某個方法在VTable的索引號是在編譯階段已經明確知道的,并不需要在運行過程中動態獲知;Java中的方法初始時都只是一個符號,并不是 一個明確的地址,只有等到該方法被第一次調用時,才會被解析成一個方法表中的偏移量,也就是說,只有在這個時候,實例方法才明確知道自己在方發表中的偏移 量了,在這之前必須經歷一個解析的過程。

因此在構造函數是Java會發生多態,即使子類此時還沒有構造完全(一個極難發現的bug)。而C++則不會發生多態,待父類構造完全,在構造子類。
Java代碼如下:

public class A {public void fun(){System.out.println("A");}public A(){this.fun();} } public class B extends A{public void fun(){System.out.println("B");}public B(){fun();}public static void main(String [] argv){B b = new B();} } //B //B

C++代碼如下:

#include <iostream> #include <string> #include <cstring> #include <cstdlib> using namespace std; class A {public:virtual void fun(){cout<<"A"<<endl;}A(){fun();} }; class B : A {public:virtual void fun(){cout<<"B"<<endl;}B(){fun();}}; int main(int argc, char *argv[]) {B b; } //A //B

可以發現,C++構造子類時,先構造父類,輸出A,然后在構造自身,輸出B。而Java在構造子類時,父類并未構造完成,但已經可以發生多態輸出B,然后再構造自身,輸出B。Java一般為了避免這種情況,會把fun等init()函數聲明為private或者finial。

轉載于:https://www.cnblogs.com/jostree/p/4873686.html

總結

以上是生活随笔為你收集整理的C++与Java多态的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

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