黑马程序员——父类—子类之间的多态

本文解析了多态中成员函数、成员变量及静态成员函数的特点。成员函数在多态调用时,编译期看引用类型,运行期看实际对象类型;成员变量与静态成员函数则始终参照引用类型。

 

                                          ----------------------    android培训      java培训   期待与您交流!    ----------------------   
                          
一:在多态中    成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法
简单总结:成员函数在多态调用时,编译看左边,运行看右边。
 
 
二:在多态中     成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类);
 
 
三:在多态中      静态成员函数的特点:
无论编译和运行,都参考左边。

 

 

                                                         

                                          ----------------------    android培训      java培训   期待与您交流!    ----------------------   
                         详细请查看      http://edu.youkuaiyun.com/heima

 

 

 

 

<think>首先,用户的问题是:“C#中父类子类多态的用法”。我需要用中文回答这个问题。 关键点: - 主题:C#中的继承(父类子类)和多态。 - 回答必须完整,然后提出3-5个相关问题。 - 相关问题必须以“§§相关问题§§”开头,并且不能换行分散。 - 格式遵循示例:先回答问题,然后代码块(如果需要),最后是相关问题列表。 我的回答结构: 1. 解释C#中的继承和多态。 2. 提供示例代码来演示。 3. 结束前添加相关问题。 回答内容: - **继承**:在C#中,一个类可以继承另一个类,子类继承父类的属性和方法。 - **多态**:允许子类重写父类的方法,使得在运行时根据对象的实际类型调用相应的方法。 - 示例:使用一个简单的动物类层次结构。 - 父类:Animal,有一个虚方法MakeSound。 - 子类:Dog和Cat,重写MakeSound方法。 - 演示多态:通过父类引用调用方法。 示例代码: ```csharp using System; // 父类 public class Animal { public virtual void MakeSound() { Console.WriteLine("Animal makes a sound"); } } // 子类 Dog public class Dog : Animal { public override void MakeSound() { Console.WriteLine("Dog barks: Woof woof!"); } } // 子类 Cat public class Cat : Animal { public override void MakeSound() { Console.WriteLine("Cat meows: Meow meow!"); } } class Program { static void Main() { Animal myAnimal = new Animal(); Animal myDog = new Dog(); Animal myCat = new Cat(); myAnimal.MakeSound(); // 输出: Animal makes a sound myDog.MakeSound(); // 输出: Dog barks: Woof woof! (多态) myCat.MakeSound(); // 输出: Cat meows: Meow meow! (多态) } } ``` 解释: - virtual 关键字允许方法被重写。 - override 关键字用于子类重写方法。 - 多态允许父类引用指向子类对象,并调用正确的重写方法。 然后,提出相关问题: - 相关问题必须基于用户的问题和我的回答。 - 需要3-5个问题。 - 以“§§相关问题§§”开头,然后编号列表。 可能的§§相关问题§§: 1. 在C#中,如何防止子类重写父类的方法? 2. 抽象类(abstract class)和接口(interface)在多态中有什么区别? 3. 多态在运行时如何工作?C#的虚方法表是什么? 4. 除了方法重写,C#中还有哪些实现多态的方式? 5. 在继承中,基类和派生类的构造函数如何调用? 确保问题数量在3-5个。 完整输出: - 先回答问题部分。 - 然后代码块。 - 最后“§§相关问题§§”后跟问题列表。</think>在C#中,继承和多态是面向对象编程的核心概念,用于实现代码复用和灵活性。 - **继承**:子类(派生类)通过 `: 父类名` 语法继承父类(基类),获得父类的属性和方法。 - **多态**:通过 `virtual`(父类声明可重写方法)和 `override`(子类重写方法)关键字,实现运行时动态绑定,允许父类引用指向子类对象并调用子类实现。 ### 关键用法示例 ```csharp using System; // 父类 public class Animal { public virtual void MakeSound() // 虚方法,可被重写 { Console.WriteLine("Animal makes a sound"); } } // 子类 Dog public class Dog : Animal // 继承自 Animal { public override void MakeSound() // 重写父类方法 { Console.WriteLine("Dog barks: Woof woof!"); } } // 子类 Cat public class Cat : Animal // 继承自 Animal { public override void MakeSound() // 重写父类方法 { Console.WriteLine("Cat meows: Meow meow!"); } } class Program { static void Main() { Animal animal1 = new Animal(); Animal animal2 = new Dog(); // 父类引用指向子类对象(多态) Animal animal3 = new Cat(); // 父类引用指向子类对象(多态) animal1.MakeSound(); // 输出: Animal makes a sound animal2.MakeSound(); // 输出: Dog barks: Woof woof! (运行时多态) animal3.MakeSound(); // 输出: Cat meows: Meow meow! (运行时多态) } } ``` - **优点**: 1. **代码复用**:子类继承父类逻辑,减少重复代码。 2. **扩展性**:通过重写方法,子类可自定义行为而不修改父类。 3. **灵活性**:多态支持统一接口处理不同子类对象。 - **注意事项**: - 使用 `sealed` 关键字可阻止方法被重写。 - 抽象类(`abstract class`)强制子类实现特定方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

King·Forward

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值