C#与C++中基类和派生类的定义及示例说明

作者: unvs 分类: ASP.NET 发布时间: 2011-08-09 11:54 ė14,577 views 6没有评论

 继承使得我们得以用一种简单的方式来定义新类。如果我们定义了一个哺乳动物类,包括哺乳动物的一些普通属性和方法,然后再定义一个狗类, 有没有必要重头开始定义呢?

实际上这是没有必要的,因为狗是哺乳动物的一种特殊动物,定义狗类可以沿用哺乳动物类的所需的属性和方法,只需加上狗的颜色属性和狗尾巴会摇方法即可。 
继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类。 
我们称从已定义类产生新类的过程称为派生。已存在的用来派生新类的类为基类,又称父类。由已存在的类派生出的新类称为派生类,又称为子类。如上例,从哺乳动物派生出狗,哺乳动物是父类,狗是子类。

在C++语言中, 一个派生类可以从一个基类派生,也可以从多个基类派生。
从一个基类派生的继承称为单继承(如动画6-1);
从多个基类派生的继承称为多继承(如动画6-2),
由两个基类一个风扇类和一个台灯类派生出一个风扇台灯类。
继承的处理从定义基类开始,基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法。
继承重用父类的代码,专注于为子类编写代码。

1.基类和派生类的一些基本概念

class B : A{}

A是基类,B是派生类.

一个类最多只允许从一个类中派生.(与C++的区别)

class C : B{}

C还可以充当B的派生类

继承总是隐式为public的,System.Object是所有类的根

编译器会把你的类悄悄的编译成 class A : System.Object{}
 

2.调用基类的构造函数        

class B : A
{
public B(string sqlstr) : base(sqlstr)
{}
}

3基类派生类对象之间的关系

class A{}
class B : A {}
class C: A {}
B b = new B();
C c = b;  //这样写是错误地,因为类型不同
A a = b; //这样写是正确的,但是一定要注意:

这样做有一个明显的限制 a 对象只能访问基类中的成员不能访问派生类中的成员
这就是为什么C#完全面向对象的原因,因为C#中所有的东西都继承自System.Object,任何东西都能赋给一个object变量

4.方法的隐藏

如果一个基类有n个方法和n个派生类,这n个派生类里又分别有n个方法.你想过会出现什么问题吗?对!就是会遇到完全一样签名的方法(方法名\参数的数量\类型完全一样)如果出现这样的情况,在编译过程中将收到一个警告,不要惊慌,仅仅是警告而已,不会影响编译的过程.

但是你应该认真的对待这个警告,如果派生类的一个对象将调用基类的一个方法,然而这个方法又在这个派生类里有相同签名的方法!那编译器该怎么办?
我可以负责任的告诉你(呵呵):
对象调用的是派生类里的方法,
这种现象在微软官方叫方法的隐藏,

如果你不想看到那个警告,可以在派生类中与基类同签名的方法前面加个new关键字,告诉编译器:我会为我造成的结果负责,不要警告我!注意这个关键字只是起个屏蔽警告的作用,你明白我的意思吗?(派生类的对象照样还是不能调用基类中同签名的方法,呵呵,还是再补一句吧,)

5.方法的覆盖

先看个例子:

class nvren
{
public virtual string leixing()
{return "这是个女人";}
}

class meinv : nvren
{
public override string leixing()
{return "这是个美女";}
}

class weizhi : nvren
{
……………
//这里并没有任何覆盖原方法的方法
}

nvren a 
= new nvren();
meinv b 
= new meinv();
weizhi c 
= new weizhi();
Console.WriteLine(a.leixing());
Console.WriteLine(b.leixing());
Console.WriteLine(c.leixing());

当调用第三个WriteLine时,程序输出了"这是个女人",现在不用我解释你也该明白了.
这种同一个语句调用不同方法的现象称为多态性(面向对象的一大特性啊!)

使用virtul和override一定要注意:
(1)两个方法必签名相同!
(2)两个方法均不能是private方法,且必须有相同的可访问性!
(3)不要试图override没有virtual的方法!
(4)不要试图不用override就覆盖基类的virtual方法(那就成了方法的隐藏了)

以下是其他几个注意的地方:
1、一个override方法将隐式的成为virtual方法,他本身可在未来的一个派生类里被覆盖
2、派生类可以访问一个基类的protected成员
3、建议保持字段为private.

本博文章基本上属于原创或收集整理,都是心血结晶。
欢迎转载分享,转载请注明出处,谢谢!
本文地址:C#与C++中基类和派生类的定义及示例说明

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ɣ回顶部