大家好,关于继承有点不明白。
如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication45
{
class Program
{
static void Main(string[] args)
{
A a;
B b = new B();
a = b;
a.abc();//调用的是类A中的方法
b.abc();//调用的是类B中的方法
a.kkk();//调用的是类B中的方法
b.kkk();//调用的是类B中的方法
Console.WriteLine(a.a);//应输出0
Console.WriteLine(b.a);//应输出1 我在看书的时候,可以是我理解有问题,还是我的软件有问题,两者不一致,所以我想让大家帮我确认一下这几个注释对吗?
Console.WriteLine(a.b);//此处错误,因为a并不含有b的定义。
} }
class A
{
public int a = 0;
public void abc()
{ }
public virtual void kkk()
{ } }
class B:A
{
public int a = 1;
public int b = 9;
public void abc()
{ }
public override void kkk()
{ } }
}
//
//我的理解是用父类来引用子类对象,比如a=b,那此时a与直接实例化A的区别在于a中的虚方法变成了b中的方法,但是,a 中并不能引用B中与A不同的成员,
//是这样吗? 我的软件输出的结果是和我的想法是一样的,但好像和书上说的不一样。请大家确认。
如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication45
{
class Program
{
static void Main(string[] args)
{
A a;
B b = new B();
a = b;
a.abc();//调用的是类A中的方法
b.abc();//调用的是类B中的方法
a.kkk();//调用的是类B中的方法
b.kkk();//调用的是类B中的方法
Console.WriteLine(a.a);//应输出0
Console.WriteLine(b.a);//应输出1 我在看书的时候,可以是我理解有问题,还是我的软件有问题,两者不一致,所以我想让大家帮我确认一下这几个注释对吗?
Console.WriteLine(a.b);//此处错误,因为a并不含有b的定义。
} }
class A
{
public int a = 0;
public void abc()
{ }
public virtual void kkk()
{ } }
class B:A
{
public int a = 1;
public int b = 9;
public void abc()
{ }
public override void kkk()
{ } }
}
//
//我的理解是用父类来引用子类对象,比如a=b,那此时a与直接实例化A的区别在于a中的虚方法变成了b中的方法,但是,a 中并不能引用B中与A不同的成员,
//是这样吗? 我的软件输出的结果是和我的想法是一样的,但好像和书上说的不一样。请大家确认。
解决方案 »
- 程序安装
- 页面中弹出窗体C#
- windows7 下进程间(一个是windows应该用程序,一个是windows服务)如何内存共享
- 我在跟帖中,提示说我用了非法词或词组不存在,请问:什么样的词组叫非法词组和词组不存在
- 类似VS Solution Explorer那种工具窗口与主窗口的融合技术怎么做呢?
- 怎么样把C#里面的内容转成DLL文件哟
- 利用SQL语句动态给一个表增加一列的问题,急!(也许对你们来说很简单)
- DataGrid能不能根据结果来合并单元格(webform和winform都想知道)
- C#怎样用DircertShow获取视频流
- 请教:使用CheckedListBox控件时,怎样一次删除多项被打钩的项。。。。。
- 二进制转换成音频文件,高手请进
- 在线等,请教用什么方法可以实现穿透内网通讯
{
public int a = 1;
public int b = 9;
public void abc()
{ }
public override void kkk()
{ } }
当你把B的实例传递给A类型引用的时候,你告诉编译器,我把B当作A来用(事实上逆变类型存在一个隐式的类型转换)。当然A没有的就不能用了。
但是你可以使用一个显式的类型转换来使用B的自有方法。
B a1 = (B)a as B;
{
public A() { }
}public class B : A
{
public B() { }
}新类(即派生类)将获取基类的所有非私有数据和行为以及新类为自己定义的所有其他数据或行为。因此,新类具有两个有效类型:新类的类型和它继承的类的类型。在上面的示例中,类 B 既是有效的 B,又是有效的 A。访问 B 对象时,可以使用强制转换操作将其转换为 A 对象。强制转换不会更改 B 对象,但您的 B 对象视图将限制为 A 的数据和行为。将 B 强制转换为 A 后,可以将该 A 重新强制转换为 B。并非 A 的所有实例都可强制转换为 B,只有实际上是 B 的实例的那些实例才可以强制转换为 B。如果将类 B 作为 B 类型访问,则可以同时获得类 A 和类 B 的数据和行为。对象可以表示多个类型的能力称为多态性。