笔记1——C++多态与Java多态的异同
最近參加網(wǎng)易筆試遇到一個(gè)問(wèn)題,考察了C++ 多態(tài)特性,自己查了相關(guān)資料學(xué)習(xí)了相關(guān)用法。
一般程序調(diào)用的函數(shù)地址是在編譯期決定了,但是具有多態(tài)特性的函數(shù)調(diào)用地址是在程序運(yùn)行期才決定。
C++與Java多態(tài)的區(qū)別
同
- 子類(lèi)重寫(xiě)父類(lèi)的函數(shù),程序運(yùn)行時(shí)根據(jù)不同對(duì)象執(zhí)行相應(yīng)函數(shù)
異
- C++中子類(lèi)只有重寫(xiě)父類(lèi)的virtual函數(shù)時(shí),此函數(shù)才具備多態(tài)特性
來(lái)兩個(gè)簡(jiǎn)單列子說(shuō)明:
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[]) {//多態(tài)特性的考察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();//非多態(tài)特性的考察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; }程序結(jié)果
- A A B B
- A1 B1 A1 B1
多態(tài)性的考察中,第一個(gè)父類(lèi)指針pa指向了父類(lèi)對(duì)象A,故調(diào)用了父類(lèi)對(duì)象A中的方法;第二個(gè)雖說(shuō)將父類(lèi)對(duì)象強(qiáng)制轉(zhuǎn)換成了子類(lèi)對(duì)象,但實(shí)際上子類(lèi)指針指向的仍是父類(lèi)對(duì)象;第三個(gè)父類(lèi)指針指向了子類(lèi)對(duì)象B,故調(diào)用子類(lèi)對(duì)象B中的方法;第四個(gè)子類(lèi)指針指向的仍然是子類(lèi)對(duì)象B,故調(diào)用了子類(lèi)對(duì)象B中的方法。
非多態(tài)性的考察中,主要看編譯時(shí)指針是哪種類(lèi)型的指針,故調(diào)用的就是相應(yīng)類(lèi)型的方法。
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();} }程序結(jié)果:A B
總結(jié)
以上是生活随笔為你收集整理的笔记1——C++多态与Java多态的异同的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Gabor滤波器的特征提取C++实现
- 下一篇: 笔记2——C++ static关键字与一