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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

虚函数和多态

發布時間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 虚函数和多态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

父類中定義的虛函數

子類對象調用該函數的同名函數時,有三種:

(1)子類不定義同名函數,那么子類對象在調用此函數時,是調用了父類的該函數,即進入父類該函數的入口地址

(2)子類對象重寫此函數(new或者override),那么子類對象在調用此函數時,是調用了子類自己的函數,至于父類該函數的入口地址是否還存在,之后討論

(3)子類定義一個同名函數,那么子類對象在調用此函數時,是調用了子類自己的函數,隱藏父類該函數的入口地址(仍存在),這種情況跟new重寫是一樣的,換句話說new加和不加是沒有影響的

那么對于第(2)種,new和override是有區別的,new是在父類函數的入口地址之外再創建一個同名函數入口地址,而override是把父類函數的入口地址覆蓋了。

具體看我在vs2008中調試的例子代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
??? class A
??? {
??????? public virtual void Get()
??????? {
??????????? Console.WriteLine("父類A函數");
??????? }
??? }

??? class B:A
??? {
??????? public new void Get()
??????? {
??????????? Console.WriteLine("子類B函數");
??????? }
??? }

??? class C : A
??? {
??????? public override void Get()
??????? {
??????????? Console.WriteLine("子類C函數");
??????? }
??? }

??? class D : A
??? {
??????? public void Get()
??????? {
??????????? Console.WriteLine("子類D函數");
??????? }
??? }

??? class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? /************
??????????? //父類對象調用父類方法
??????????? A a = new A();
??????????? a.Get();
??????????? Console.ReadLine();

??????????? //子類對象調用子類(new)方法
??????????? B b = new B();
??????????? b.Get();
??????????? Console.ReadLine();

??????????? //子類對象調用子類(override)方法
??????????? C c = new C();
??????????? c.Get();
??????????? Console.ReadLine();

??????????? //子類對象調用子類方法
??????????? D d = new D();
??????????? d.Get();
??????????? Console.WriteLine();
???????????? * /

??????????? /***************
??????????? //父類對象試圖調用子類方法,需要將子類對象轉化為父類對象,b調用的是父類的函數,c調用的是子類的函數。
??????????? //因為關鍵字new實現重寫是再創建了一個函數入口地址,也就是說這時子類對象同時保存了父類該函數的入口地址和子類該函數的入口地址,
??????????? //只是父類該函數的入口地址被隱藏,但仍可用,當父類對象去調用去調用子類方法時,子類會提供父類對象該函數的入口地址。這樣就實現了根據對象類型自動選擇函數入口地址。(其實這里new加和不加效果是一樣的)
??????????? //而關鍵字override實現重寫是用子類創建的該函數入口地址覆蓋父類該函數的入口地址,這樣一來,子類對象只保存了子類該函數的入口地址。
??????????? a = b;
??????????? a.Get();
??????????? Console.WriteLine();

??????????? a = c;
??????????? a.Get();
??????????? Console.WriteLine();

??????????? a = d;
??????????? a.Get();
??????????? Console.WriteLine();
??????????? */

??????????? /***************
??????????? //子類對象試圖調用父類方法,需要將父類對象轉化為子類對象。父類對象可以強制轉換為子類對象,但是前提是此父類對象為子類實例化的結果。
??????????? //“父類對象為子類實例化的結果”與“父子類各自實例化一個對象后,將子類對象轉化為父類對象”這兩種情況都能實現
??????????? A a = new B();
??????????? a.Get();
??????????? Console.ReadLine();

??????????? ((B)a).Get();
??????????? ((A)a).Get();

??????????? a = new C();
??????????? a.Get();
??????????? Console.ReadLine(); ?
???????????? * /
??????? }
??? }
}

用override可以實現多態,用new可以實現更漂亮的多態,可以參考這篇文章http://www.cnblogs.com/kimma/archive/2008/09/07/1285857.html

?

總結虛函數作用,純虛函數就是強制子類有同樣的成員函數接口,虛函數就是強制子類有同樣的成員函數接口以及接口默認實現。一個類中最好不要完全沒有虛函數也不要全是虛函數,這都是設計不合理。總的來說,虛函數實現多態。

轉載于:https://www.cnblogs.com/webclient/archive/2012/06/11/2545483.html

總結

以上是生活随笔為你收集整理的虚函数和多态的全部內容,希望文章能夠幫你解決所遇到的問題。

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