• 虚函数 纯虚函数 抽象类


    虚函数

      定义:在某基类中声明为 virtual, 并在一个或多个派生类中被重新定义的成员函数
              子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virtual(虚函数)
      语法:virtual 函数返回类型 函数名(参数表) { 函数体 }
      用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数
      
        虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式

        在定义了虚函数后,派生类继承虚函数的接口,由于虚函数还提供了实现,派生类可以选择改写(override)它们或不改写它们。
        但基类与派生类的参数个数与类型要一致。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
     
    纯虚函数

        定义: 如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为 virtual 函数名=0  我们把这样的函数(方法)称为纯虚函数。

        特征: 纯虚函数必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。
        目的: 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。

    非虚函数

        当一个成员函数为非虚函数时,不管它的派生类有多特殊, 非虚函数的行为都是不变的.
        声明非虚函数的目的在于,使派生类继承函数的接口和强制性实现。(所有的派生类都应该使用该非虚函数完成某一个功能)
     

    抽象类
    * 如果一个类包含了纯虚函数,称此类为抽象类

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        public class Animal
        {
            public virtual void Eat()
            {
                Console.WriteLine("I eat like a generic Animal.");
            }
        }
    
        public class Wolf : Animal
        {
            public override void Eat()
            {
                Console.WriteLine("I eat like a wolf!");
            }
        }
    
        public class Fish : Animal
        {
            public override void Eat()
            {
                Console.WriteLine("I eat like a fish!");
            }
        }
    
        public class GoldFish : Fish
        {
            public override void Eat()
            {
                Console.WriteLine("I eat like a goldfish!");
            }
        }
    
        public class OtherAnimal : Animal
        {
            // Eat() method is not overridden, so the base class method will be used.
        }
    
        public class Program
        {
            public static void Main(string[] args)
            {
                IList<Animal> animals = new List<Animal>();
    
                animals.Add(new Animal());
                animals.Add(new Wolf());
                animals.Add(new Fish());
                animals.Add(new GoldFish());
                animals.Add(new OtherAnimal());
    
                foreach (Animal currentAnimal in animals)
                {
                    currentAnimal.Eat();
                }
            }
        }
    }
    
  • 相关阅读:
    关于git你日常工作中会用到的一些东西
    require.context
    vue-cli3.0 使用postcss-plugin-px2rem(推荐)和 postcss-pxtorem(postcss-px2rem)自动转换px为rem 的配置方法;
    div实现富文本编辑框
    webpack-bundle-analyzer打包文件分析工具
    web页面调用支付宝支付
    ajax回调中window.open弹出的窗口会被浏览器拦截的解决方法
    Django 文件上传
    Django 序列化 前端通过ajax来获取数据库中的数据
    Django Form组件 基于源码的扩展
  • 原文地址:https://www.cnblogs.com/streetpasser/p/2791102.html
Copyright © 2020-2023  润新知