虚方法的定义和使用

虚方法是在面向对象编程中的一个概念,是继承和多态性的基础,用来描述能够被子类重写(override)的方法。这使得在子类对象上调用这个方法时,实际执行的是子类中重写的方法。

虚方法的存在意味着在编译时无法确定应该调用哪个方法,而是在运行时根据对象的实际类型来确定。这种多态性的特性使得程序更加灵活和可扩展。

如何定义虚方法:

在C++中,通过在函数声明前加上virtual关键字来声明一个虚方法,在子类中可以使用override关键字来重写。

在C#和Java中,所有非静态的方法都默认是虚方法(隐式声明),也可以使用virtual关键字来显式声明虚方法(好处是增加代码的可读性和可维护性),在子类中可以使用override关键字来重写。

虚方法的定义和使用范例(C#):实现多态的过程

using System;

//定义父类Animal
class Animal
{
    //用关键词virtual声明虚方法 
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal makes a sound");
    }
}

//定义子类Dog 继承父类 Animal
class Dog : Animal
{
    //用关键词override 重写父类虚方法
    public override void MakeSound()
    {
        Console.WriteLine("Dog barks");
    }
}

//定义子类Cat 继承父类 Animal
class Cat : Animal
{
    //用关键词override 重写父类虚方法
    public override void MakeSound()
    {
        Console.WriteLine("Cat meows");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Animal animal = new Animal(); //创建Animal对象
        animal.MakeSound(); // 输出: "Animal makes a sound"

        Animal dog = new Dog(); //创建Dog对象,执行Dog类中重写的方法
        dog.MakeSound(); // 输出: "Dog barks"

        Animal cat = new Cat();  //创建Cat对象,执行Cat类中重写的方法
        cat.MakeSound(); // 输出: "Cat meows"
    }
}

 向上转型写法: Animal dog = new Dog(); 

  将一个派生类的实例(Dog对象)赋值给一个基类的变量(Animal对象),这种写法可以将多个不同的子类对象统一当作基类处理,能够更通用地处理对象,也可以方便地扩展和使用多态性的特点。

相关推荐

  1. 方法定义使用

    2024-03-15 19:02:03       42 阅读
  2. C#方法使用场景

    2024-03-15 19:02:03       30 阅读
  3. C#方法抽象方法

    2024-03-15 19:02:03       25 阅读
  4. C++函数使用

    2024-03-15 19:02:03       36 阅读
  5. 【Python】普通字典定义使用方式

    2024-03-15 19:02:03       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-15 19:02:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-15 19:02:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-15 19:02:03       87 阅读
  4. Python语言-面向对象

    2024-03-15 19:02:03       96 阅读

热门阅读

  1. TCP的三次握手和四次挥手

    2024-03-15 19:02:03       39 阅读
  2. qt5-入门-主窗口设计1

    2024-03-15 19:02:03       42 阅读
  3. tkinter页面及treeview布局

    2024-03-15 19:02:03       34 阅读
  4. 对象转数组,数组转对象的常用方法

    2024-03-15 19:02:03       43 阅读
  5. 每天一个数据分析题(一百九十九)

    2024-03-15 19:02:03       46 阅读
  6. 小米消金坚持打防并举,持续筑牢反诈坚实堤坝

    2024-03-15 19:02:03       35 阅读
  7. C++ 智能指针的正确使用方式:unique_ptr VS shared_ptr

    2024-03-15 19:02:03       34 阅读
  8. k8s的pod服务升级,通过部署helm升级

    2024-03-15 19:02:03       43 阅读
  9. axios 请求 url 地址,判断网络地址是否存在

    2024-03-15 19:02:03       42 阅读
  10. 面试经典-26-Z 字形变换

    2024-03-15 19:02:03       42 阅读
  11. mysql统计数据库大小

    2024-03-15 19:02:03       40 阅读
  12. TCP客户端发送结构体数据

    2024-03-15 19:02:03       39 阅读
  13. 数仓开发之ODS层

    2024-03-15 19:02:03       47 阅读
  14. 微信小程序canvas画布不清晰解决方法

    2024-03-15 19:02:03       43 阅读