笔记1——C++多态与Java多态的异同
生活随笔
收集整理的這篇文章主要介紹了
笔记1——C++多态与Java多态的异同
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近參加網易筆試遇到一個問題,考察了C++ 多態特性,自己查了相關資料學習了相關用法。
一般程序調用的函數地址是在編譯期決定了,但是具有多態特性的函數調用地址是在程序運行期才決定。
C++與Java多態的區別
同
- 子類重寫父類的函數,程序運行時根據不同對象執行相應函數
異
- C++中子類只有重寫父類的virtual函數時,此函數才具備多態特性
來兩個簡單列子說明:
C++
#include <iostream>class A{public:virtual void f(){std::cout << "A " << std::endl;}void f1(){std::cout << "A1 " << std::endl;} };class B : public A{public:void f(){std::cout << "B " << std::endl;}void f1(){std::cout << "B1 " << std::endl;} };int main(int argc, char *argv[]) {//多態特性的考察A *pa = new A();pa->f();B *pb = (B *)pa;pb->f();delete pa,pb;pa = new B();pa->f();pb = (B *)pa;pb->f();//非多態特性的考察pa = new A();pa->f1();pb = (B *)pa;pb->f1();delete pa,pb;pa = new B();pa->f1();pb = (B *)pa;pb->f1();return 0; }程序結果
- A A B B
- A1 B1 A1 B1
多態性的考察中,第一個父類指針pa指向了父類對象A,故調用了父類對象A中的方法;第二個雖說將父類對象強制轉換成了子類對象,但實際上子類指針指向的仍是父類對象;第三個父類指針指向了子類對象B,故調用子類對象B中的方法;第四個子類指針指向的仍然是子類對象B,故調用了子類對象B中的方法。
非多態性的考察中,主要看編譯時指針是哪種類型的指針,故調用的就是相應類型的方法。
Java
class A {public void f(){System.out.println("A");} }class B extends A {public void f(){System.out.println("B");} }public class Test {public static void main(String[] args){A a = new A();a.f();a = new B();a.f();} }程序結果:A B
總結
以上是生活随笔為你收集整理的笔记1——C++多态与Java多态的异同的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gabor滤波器的特征提取C++实现
- 下一篇: 笔记2——C++ static关键字与一