永发信息网

c#多态的运行机理

答案:4  悬赏:30  手机版
解决时间 2021-02-14 08:56
请大家说说是怎莫运行的
最佳答案
描述一下C++的,应该差不多

1、编译器发现一个类中有虚函数,编译器会立即为此类生成虚拟函数表 vtable(后面有对vtable的分析)。虚拟函数表的各表项为指向对应虚拟函数的指针。

2、编译器在此类中隐含插入一个指针vptr(对vc编译器来说,它插在类的第一个位置上)。

有一个办法可以让你感知这个隐含指针的存在,虽然你不能在类中直接看到它,但你可以比较一下含有虚拟函数时的类的尺寸和没有虚拟函数时的类的尺寸,你能够发现,这个指针确实存在。

class cnovirtualfun
{
private:
long lmember;
public:
long getmembervalue();
} class chavevirtualfun
{
private:
long lmember;
public:
virtual long getmembervalue();
}

cnovirtualfun obj;
sizeof(obj) -> == 4;
chavevirtualfun obj;
sizeof(obj) -> == 8;

3、在调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr与vtable的关联代码,将vptr指向对应的vtable。这就将类与此类的vtable联系了起来。

4、在调用类的构造函数时,指向基础类的指针此时已经变成指向具体的类的this指针,这样依靠此this指针即可得到正确的vtable,从而实现了多态性。在此时才能真正与函数体进行连接,这就是动态联编。
全部回答
多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子类都有其不同的代码实现,所以当用父类来引用这些子类时,同样的操作而可以表现出不同的操作结果,这就是所谓的多态. public class Father { public Father() { } public virtual string MyName() { return "father"; } } public class Son_Zhang:Father { public Son_Zhang() { } public override string MyName() { return "Zhang"; } } public class Son_Wang:Father { public Son_Wang() { } public override string MyName() { return "Wang"; } } public static void Main() { Father people = new Son_Zhang(); Console.WriteLine(people.MyName()); }
我就不用真实代码来说了 简单的说 假如你有个方法 是 void 动物叫(动物) 参数是要叫的动物 而你现在有 狗 猫 鸭子 都是继承动物这个类或者实现动物这个接口 那么多态就是 动物叫(狗) 运行结果是 “汪汪” 动物叫(猫) 运行结果是 “喵喵” 动物叫(鸭子) 结果是 “嘎嘎” 嘎嘎
这样跟你说吧,例如猫和狗 猫和狗都是动物,身上都有毛 所以定义了一个动物类animal clase animal { 定义一个base基本方法输出:我是有毛的动物 } 但是,虽然他们都是有毛的动物,他们还是有他们自己的属性的 clase dog:animal { 继承animal的base基本方法,重新输出:我的叫声是汪 } class cat:animal { 继承animal的base基本方法,重新输出:我的叫声是喵 } 然后用在一个主函数调用他们相同名称的方法的话就会输出不同的结果,这就叫多态
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
花雨伞地址在什么地方,想过去办事
【闰年的算法】平年与闰年的算法?
一个直角三角形三条边的长度分别是3分米、4分
索纳塔8一键启动按键功能都有哪些
氧星星有没有毒性?安全吗?
华晨劳保工装我想知道这个在什么地方
剪板机刀片生产厂家一般用什么材料做?
老师跟水讲话,水会有反应。真的吗?
阅读资料结合蛙“神经-腓肠肌”标本示意图,
我的世界生存模式怎么收集资源 新手收集资源
为什么推行营改增改革,改革的意义何在
如果你男朋友看见一个女的跟你说她好漂亮十个
哈那河这个地址在什么地方,我要处理点事
宁波港口edi怎么和以前不一样了
谁用蓝光VR看电影怎么不能安装电脑上看
推荐资讯
驼龙湾在哪里啊,我有事要去这个地方
男友现在29岁,没车没房,喜欢他想结婚又怕以
做2亿9千万的工程甲方抽取8个点,费用是多少,
阿青批发零售店地址在什么地方,想过去办事
高中毕业读成都卫校录取分数线大概是多少
求一款蓝牙音箱 两百元以内 主要是睡觉前听听
对确定药品召回的药品,医疗机构内负责召回药
范杰工作室地址在什么地方,我要处理点事
射完精后肚子里咕噜咕噜响是怎么回事
筠连到成都和筠连到重庆哪个更方便?
白坭坑村地址在什么地方,想过去办事
鑫鑫棋牌地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?