第二章 C#继承&继承类型&虚函数&抽象类&抽象函数&抽象方法&隐藏方法

继承:实现继承,接口继承。

C#不支持多实现继承,支持多接口继承

public class Class4:Class3,IInterface1,IInterface2
{

}

虚方法:virtual

基类中声明virtual方法,在派生类中可以重写,并且调用的时候总是调用重写的方法。

public class Class1
    {
        public virtual void A()
        {
            Console.WriteLine("Class1.A");
        }
        public void B()
        {
            Console.WriteLine("Class1.B");
        }
    }
public class Class2 : Class1
    {
        public override void A()
        {
            Console.WriteLine("Class2.A");
        }
        public void B()
        {
            Console.WriteLine("Class2.B");
        }
    }
            Class2 c2 = new Class2();
            Class1 c3 = c2;
            c3.A();
            c3.B();

输出结果:

Class2.A
Class1.B原因:Class1 c3 = c2;会把c2转化成Class1类型的,c3.A()CLR会首先调用该类型(即Class1)中的方法,当检测到是virtual类型的时候,会调用派生类中的方法。如果不是virtual类型,直接调用本类的方法。

可以参考:http://www.cnblogs.com/kdalan/archive/2012/05/29/2523470.html

抽象类:abstract class

抽象方法:public abstract void search();

类中只要有抽象方法,则类必须为抽象类;抽象方法只是声明,没有方法体,抽象类可以被继承,在派生类中必须重写抽象类中的抽象方法。

隐藏方法:

在子类和基类中定义一样的方法,则基类中的方法会自动隐藏。但是在子类中会有警告。如有意隐藏请使用new字段。

public class Class1
    {
        public virtual void A()
        {
            Console.WriteLine("Class1.A");
        }
        public void B()
        {
            Console.WriteLine("Class1.B");
        }
    }
public class Class2 : Class1
    {
        public override void A()
        {
            Console.WriteLine("Class2.A");
        }
        public new void B()
        {
            Console.WriteLine("Class2.B");
        }
    }

class2中的 B();跟class1 中的B();声明一样,所以要隐藏class1中的方法,在class2中使用new字段。

时间: 2024-10-06 05:36:41

第二章 C#继承&继承类型&虚函数&抽象类&抽象函数&抽象方法&隐藏方法的相关文章

[GeekBand] C++继承关系下虚函数内存分布

本文参考文献:GeekBand课堂内容,授课老师:侯捷 :深度探索C++对象模型(侯捷译) :网络资料,如:http://blog.csdn.net/sanfengshou/article/details/4574604 说明:由于条件限制,仅测试了Windows平台下的VS2013 IDE.其余平台结果可能不同,但原理都类似.建议读者自己在其他平台进行测试. 1.什么是虚函数? 虚函数是类的非静态成员函数,在类中的基本形式如下:virtual 函数返回值类型 虚函数名(形参表) 如:virtu

含有虚函数菱形的虚拟继承(没有对虚函数进行重写)

在VS2013编程,调试 问题 :  菱形继承会引来,二义性 1.源代码 </pre><pre name="code" class="cpp">#include <iostream> using namespace std; class Base { public: virtual void FunTest() { cout << "Base::FunTest () " << endl;

谈谈c++中继承中的虚函数

c++继 承中的虚函数 c++是一种面向对象的编程语言的一个很明显的体现就是对继承机制的支持,c++中继承分很多种,按不同的分类有不同分类方法,比如可以按照基类的个数分为多继承和单继承,可以按照访问权限分为public继承.protected继承和private继承,按照是否是虚拟继承可以分为virtual继承和non-virtual继承.当然这里的分类标准都是有重叠的部分,比如,non-virtual继承又可以分为单继承和多继承.这里要讨论的是虚函数,因此主要从virtual和non-virt

C++ Primer 笔记(2)第二章 变量与基本类型

第二章 变量与基本类型 1.基本内置类型包括算术类型和空类型,算术类型分为两类:整型(包括字符和布尔类型)和浮点型: 2.布尔类型(bool)的取值是真(true)或者假(false): 3.字面值常量:每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型, 由单引号括起来的一个字符是char型字面值,有双引号括起来的零个或者多个字符则构成字符串字面值: 20  整形字面值 ‘a’ 字符字面值 “Hello World”或者“”都会字符串字面值 ‘A’表示单独字符A,而“A”

C++ 虚函数 、纯虚函数、接口的实用方法和意义

也许之前我很少写代码,更很少写面向对象的代码,即使有写多半也很容易写回到面向过程的老路上去.在写面向过程的代码的时候,根本不管什么函数重载和覆盖,想到要什么功能就变得法子的换个函数名字,心里想想:反正函数重载本质也就是入栈了两个不同的函数. 回过头来讲,让我了解标题这三个概念的实际用处,还是在于我这第四次重写毕业论文的代码,将它改写成面向对象的时候,才理解的.在面向对象设计的过程中, 类是从抽象逐渐具体起来的,父类可以是非常非常抽象的东西,而最终实例化的子类就非常具体了.在这个继承的过程中,不断

C++ 虚函数&amp;纯虚函数&amp;抽象类&amp;接口&amp;虚基类(转)

http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的. 多态可以让父类的指针有“多种形态”,这是一种泛型技术.(所谓泛型技术,就是试图使用不变的代码来实现可变的算法). 2. 虚函数 2.1

虚函数/纯虚函数/抽象类/接口/虚基类

1.多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 在Java中,没有指针,就直接用父类实例化子类对象 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的,多态可以让父类的指针有“多种形态”,这是一种泛型技术. 所谓泛型技术,就是试图使用不变的代码来实现可变的算法 2.虚函数 在基类的类定义中,定义虚函数的一般形式: Virtual 函数返回值类型 虚函数名(形参表){ 函数

虚函数和抽象函数的区别

虚函数与抽象函数 虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写 抽象函数是没有代码,子类继承后一定要重写 在一个类中用虚函数: 是因为在超类中有实际代码的方法,但明确允许子类可以作重写 而且当子类重写后,可以用子类实例超类:如果这样,超类变量调用虚函数时,执行的是子类的方法 在一个类中用抽象函数 是在写超类时不确定函数的代码,让子类去实现 抽象函数没有方法体. 简单来说虚函数(Virtual)已经包含了也必须包含默认的实现,所以在派生类中可以重新实现也可以不

虚函数和抽象函数

虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写   抽象函数是没有代码,子类继承后一定要重写 在一个类中用虚函数:   是因为在超类中的有实际代码的方法,但明确允许子类可以作重写   而且当子类重写后,可以用子类实例超类:如果这样,超类变量调用虚函数时,执行的是子类的方法       在一个类中用抽象函数   是在写超类时不确定函数的代码,让子类去实现   抽象函数没有方法体. 简单来说虚函数(Virtual)已经包含了也必须包含默认的实现,所以在派生类中可以