c#多态的运行机理
答案:4 悬赏:30 手机版
解决时间 2021-02-14 08:56
- 提问者网友:树红树绿
- 2021-02-14 05:33
请大家说说是怎莫运行的
最佳答案
- 五星知识达人网友:廢物販賣機
- 2021-02-14 06:20
描述一下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,从而实现了多态性。在此时才能真正与函数体进行连接,这就是动态联编。
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,从而实现了多态性。在此时才能真正与函数体进行连接,这就是动态联编。
全部回答
- 1楼网友:行路难
- 2021-02-14 09:10
多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子类都有其不同的代码实现,所以当用父类来引用这些子类时,同样的操作而可以表现出不同的操作结果,这就是所谓的多态.
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());
}
- 2楼网友:醉吻情书
- 2021-02-14 08:15
我就不用真实代码来说了
简单的说 假如你有个方法 是 void 动物叫(动物)
参数是要叫的动物
而你现在有 狗 猫 鸭子 都是继承动物这个类或者实现动物这个接口
那么多态就是
动物叫(狗) 运行结果是 “汪汪”
动物叫(猫) 运行结果是 “喵喵”
动物叫(鸭子) 结果是 “嘎嘎”
嘎嘎
- 3楼网友:渊鱼
- 2021-02-14 07:53
这样跟你说吧,例如猫和狗
猫和狗都是动物,身上都有毛
所以定义了一个动物类animal
clase animal
{
定义一个base基本方法输出:我是有毛的动物
}
但是,虽然他们都是有毛的动物,他们还是有他们自己的属性的
clase dog:animal
{
继承animal的base基本方法,重新输出:我的叫声是汪
}
class cat:animal
{
继承animal的base基本方法,重新输出:我的叫声是喵
}
然后用在一个主函数调用他们相同名称的方法的话就会输出不同的结果,这就叫多态
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯