C#规定,抽象类不能实例化,如下代码会发生编译错误:

Animal myanimal=new Animal();

那么如下代码正确吗?

Animal myanimal=new Dog();
myanimal.Cry();

这段代码是完全正确的。既然抽象类不能实例化,那么这段代码为什么又可以运行呢?首先要明确上面的代码并没有实例化抽象类,只是声明了一个抽象类的对象myanimal,实例化时必须通过构造函数来实现,这里调用的是子类的构造函数,所以实例化的是子类对象,只是抽象类对象引用了子类实例。那么这个对象是子类还是父类呢?

using System;
public abstract class Animal
{
public abstract void Cry();
public void Show()
{
    Console.WriteLine("这是抽象类中的方法");
}
}

public class Dog: Animal
{
public override void Cry()
{
    Console.WriteLine("狗的叫声是汪汪");
}
public void ShowDog()
{
    Console.WriteLine("这是派生类的方法");
}
}

class Progarm
{
static void Main()
{
    Animal animal = new Dog();
    animal.Cry();
    animal.Show();
}
}

抽象类对象调用了子类的Cry()方法和本身Show()方法,子类的ShowDog()方法是不能访问的。说明抽象对象引用子类实例后,基本上还是属于抽象类,能够访问子类重写的方法和父类自己的属性和方法,子类自己的属性和方法是不能访问的。

扩展:如果有很多种动物,每个动物都要实例化,然后输出,工作量很大,也不是最佳表达方式。下面用数组来组织这些动物,主函数中的测试代码修改为以下代码

Animal[] animals=new Animal[3]{new Dog(),new Cat(),new Sheep()};

foreach (Animal a in animals)
{
a.Cry();
}

注意:抽象类的派生类必须实现所有的抽象方法,必须使用override关键字,并且不能是私有的。

C#多态性-抽象类对象引用子类实例相关推荐

  1. 纯虚函数--抽象类中的this到底指的是哪个子类实例呢

    抽象类中的this到底指的是哪个子类实例呢?请看代码: thread.h #ifndef __THREAD_H__ #define __THREAD_H__#include <iostream& ...

  2. java多态讲解例子_Java多态性定义与用法实例详解

    本文实例讲述了Java多态性定义与用法.分享给大家供大家参考,具体如下: 多态性是通过: 1 接口和实现接口并覆盖接口中同一方法的几不同的类体现的 2 父类和继承父类并覆盖父类中同一方法的几个不同子类 ...

  3. python 私有和保护成员变量如何实现?—— 单下划线 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量; 双下划线 开始的是私有成员,意思是只有类对象自己能访问...

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量. 在python中定义私有变量只需要在变 ...

  4. java异常 子类_Java异常 Exception类及其子类(实例讲解)

    C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...

  5. python类继承返回值_python继承threading.Thread实现有返回值的子类实例

    继承与threading.thread实现有返回值的子类mythread,废话不多说,大家直接看代码 import threading class mythread(threading.thread) ...

  6. java exception子类_Java异常 Exception类及其子类(实例讲解)

    C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...

  7. python-面向对向-实例方法的继承-多继承父类中的super与子类实例对象的关系

    初始代码 class Father:def run(self):print('father de run')def one(self):print('father de one')class Moth ...

  8. python类继承实例_python类继承与子类实例初始化用法分析

    这篇文章主要介绍了python类继承与子类实例初始化用法,实例分析了Python类的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 [ 先贴参考书籍原文(中文英文对照)] __init__方法介 ...

  9. java判断接口对象是哪个子类_Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例。...

    Java提供了一个关键字( ),可以判断一个对象是否为某个类(或接口)的实例或者子类实例. 更多相关问题 -Do you know a has just opened in our neighborh ...

最新文章

  1. HTML样式以及使用
  2. 女程序员也有 35 岁危机焦虑吗?
  3. 排查Java线上服务故障的方法和实例分析
  4. tomcat正常启动但是访问 404
  5. 【Linux】虚拟机 Ubuntu sudo指令实现Gparted安装和 dsv/sda1 内存扩展
  6. umask 和 新建文件、目录的默认权限
  7. Unity Built-in Shader转URP Shader 接口查询对照表
  8. .NET Core 迁移躺坑记续集--Win下莫名其妙的超时
  9. inputstream重新赋值之前需要close吗_变量提升真的搞懂了吗?打脸的一道题
  10. HTML中关于图像和表格,链接等的知识
  11. Android Sdk 安装配置
  12. 并联机器人市场呈现快速增长之势
  13. 关于各种无法解析的外部符号问题的相应解决方案【转】
  14. drawforeground只有鼠标事件进入才刷新_罗技各系鼠标测评(2020年12月更新)
  15. Gson反序列化详解
  16. Google Reader 使用技巧及OPML订阅源分享
  17. python 循环十次_python机器学习——十次交叉验证训练的数据准备算法
  18. C语言·XDOJ练习·拼数字
  19. 区间贪心:最小区间覆盖问题、PIPI的高速公路
  20. 地图php,php调用google地图

热门文章

  1. Linux虚拟机基本操作
  2. 基础 PHP 数据类型
  3. Android中获取系统语言(适用于Android7.0以上系统)
  4. 50 xen虚拟化技术基础、xen虚拟化技术进阶
  5. 根据之前发的那SQL语句查询表结构的语句做了个MSSQL实体类生成器!
  6. Windows注册文件类型信息的学习心得
  7. 利用组策略防止计算机访问共享资源
  8. Jerry的碎碎念:SAPUI5, Angular, React和Vue
  9. Rancher-创建自己的应用商店教程
  10. Linux系统文件类型