zoukankan      html  css  js  c++  java
  • 虚函数 纯虚函数 抽象类

    虚函数

      定义:在某基类中声明为 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();
                }
            }
        }
    }
    
  • 相关阅读:
    javascript无提示关闭窗口,兼容IE,Firefox
    vbs简单制作U灵大盗带发送功能的代码
    正则表达式提取网址、标题、图片等一例(.Net Asp Javascript/Js)的实现
    在asp.net中保持Session的有效期
    批处理编程 介绍
    IIS日志清理CMD版,VBS版,JS版,WSH版
    正则表达式提取图片地址
    用U盘安装GNU/Linux
    三核浏览器Lunascape新版发布
    黑客基础之DOS(最齐全)
  • 原文地址:https://www.cnblogs.com/streetpasser/p/2791102.html
Copyright © 2011-2022 走看看