base保留字 从派生类中访问基类的成员
2013-04-23 11:26
148 查看
base关键字,用于从派生类中访问基类的成员。换言之,是用来“访问基类的”
一 调用基类上已被其他方法重写的方法。
二 指定创建派生类实例时应调用的基类构造函数。
base使用通用规则:
①尽量少用或者不用base和this。除了避开子类的名称冲突和在一个构造函数中调用其他的构造函数之外,base和this的使用容易引起不必要的结果。
②在静态成员中使用base和this都是不允许的。原因是,base和this访问的都是类的实例,也就是对象,而静态成员只能由类来访问,不能由对象来访问。 this是对实例的引用,而静态成员不属于实例而是属于类的,所以是不允许的。
③base是为了实现多态而设计的。
④使用this或base关键字只能指定一个构造函数,也就是说不可同时将this和base作用在一个构造函数上。
⑤简单的来说,base用于在派生类中访问重写的基类成员;而this用于访问本类的成员,当然也包括继承而来公有和保护成员。
⑥除了base,访问基类成员的另外一种方式是:显示的类型转换来实现。只是该方法不能为静态方法。
第一条,参见下面的程序:
// keywords_base.cs
// Accessing base class members
using System;
public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine";
public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
}
class Employee : Person
{
public string id = "ABC567EFG";
public override void GetInfo()
{
// Calling the base class GetInfo method:
base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
}
class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
对象E,其方法GetInfo访问了基类的方法base.GetInfo();从而对基类中已经被重写的方法进行了调用。
第二条,参见下面的程序:
// keywords_base2.cs
using System;
public class BaseClass
{
int num;
public BaseClass()
{
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int i)");
}
public int GetNum()
{
return num;
}
}
public class DerivedClass : BaseClass
{
// This constructor will call BaseClass.BaseClass()
public DerivedClass() : base()
{
}
// This constructor will call BaseClass.BaseClass(int i)
public DerivedClass(int i) : base(i)
{
}
static void Main()
{
DerivedClass md = new DerivedClass();
DerivedClass md1 = new DerivedClass(1);
}
}
在这里,对于派生类的构造函数,可以直接用“public DerivedClass(int i) : base(i)”的方式进行指定,base中只写变量的名称,如果函数体中还有代码,则是执行完基类的构造函数后,继续往下执行的部分,所以,在处理参数的时候,要分两部分处理,一部分是给基类的构造函数,一部分是给剩下的函数体的,参看下面的代码:
using System;
class BaseClass
{
protected BaseClass(string a)
{
Console.WriteLine("产生参数 {0} ",a);
}
}
class Derivcedclass:BaseClass
{
public Derivcedclass(string k,string d):base(k)
{
Console.WriteLine("产生参数{0}",d);
}
}
class Test
{
static void Main()
{
Derivcedclass test = new Derivcedclass("Wuxinhong", "Pengyao");
}
}
在创建类的对象时,一共有两个参数,"Wuxinhong", "Pengyao",其传到基函数 public Derivcedclass(string k,string d):base(k),而参数k传递到了所继承的基类的基函数,余下的d 则传递到了函数体中,这充分说明了:
base可以在派生类的构造函数中,起一个指定的作用。
一 调用基类上已被其他方法重写的方法。
二 指定创建派生类实例时应调用的基类构造函数。
base使用通用规则:
①尽量少用或者不用base和this。除了避开子类的名称冲突和在一个构造函数中调用其他的构造函数之外,base和this的使用容易引起不必要的结果。
②在静态成员中使用base和this都是不允许的。原因是,base和this访问的都是类的实例,也就是对象,而静态成员只能由类来访问,不能由对象来访问。 this是对实例的引用,而静态成员不属于实例而是属于类的,所以是不允许的。
③base是为了实现多态而设计的。
④使用this或base关键字只能指定一个构造函数,也就是说不可同时将this和base作用在一个构造函数上。
⑤简单的来说,base用于在派生类中访问重写的基类成员;而this用于访问本类的成员,当然也包括继承而来公有和保护成员。
⑥除了base,访问基类成员的另外一种方式是:显示的类型转换来实现。只是该方法不能为静态方法。
第一条,参见下面的程序:
// keywords_base.cs
// Accessing base class members
using System;
public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine";
public virtual void GetInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("SSN: {0}", ssn);
}
}
class Employee : Person
{
public string id = "ABC567EFG";
public override void GetInfo()
{
// Calling the base class GetInfo method:
base.GetInfo();
Console.WriteLine("Employee ID: {0}", id);
}
}
class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
对象E,其方法GetInfo访问了基类的方法base.GetInfo();从而对基类中已经被重写的方法进行了调用。
第二条,参见下面的程序:
// keywords_base2.cs
using System;
public class BaseClass
{
int num;
public BaseClass()
{
Console.WriteLine("in BaseClass()");
}
public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int i)");
}
public int GetNum()
{
return num;
}
}
public class DerivedClass : BaseClass
{
// This constructor will call BaseClass.BaseClass()
public DerivedClass() : base()
{
}
// This constructor will call BaseClass.BaseClass(int i)
public DerivedClass(int i) : base(i)
{
}
static void Main()
{
DerivedClass md = new DerivedClass();
DerivedClass md1 = new DerivedClass(1);
}
}
在这里,对于派生类的构造函数,可以直接用“public DerivedClass(int i) : base(i)”的方式进行指定,base中只写变量的名称,如果函数体中还有代码,则是执行完基类的构造函数后,继续往下执行的部分,所以,在处理参数的时候,要分两部分处理,一部分是给基类的构造函数,一部分是给剩下的函数体的,参看下面的代码:
using System;
class BaseClass
{
protected BaseClass(string a)
{
Console.WriteLine("产生参数 {0} ",a);
}
}
class Derivcedclass:BaseClass
{
public Derivcedclass(string k,string d):base(k)
{
Console.WriteLine("产生参数{0}",d);
}
}
class Test
{
static void Main()
{
Derivcedclass test = new Derivcedclass("Wuxinhong", "Pengyao");
}
}
在创建类的对象时,一共有两个参数,"Wuxinhong", "Pengyao",其传到基函数 public Derivcedclass(string k,string d):base(k),而参数k传递到了所继承的基类的基函数,余下的d 则传递到了函数体中,这充分说明了:
base可以在派生类的构造函数中,起一个指定的作用。
相关文章推荐
- PetShop 4.0知识点:base 关键字用于从派生类中访问基类的成员
- PetShop 4.0知识点:base 关键字用于从派生类中访问基类的成员
- base 关键字用于从派生类中访问基类的成员:
- 派生类可以访问基类的private成员吗
- 【6.13】 定义基类Base,其数据成员为高h,定义成员函数disp为虚函数。然后再由High派生出长方体类Cuboid与圆柱体类Cylinder。并在两派生类中定义成员函数disp为虚函数。在主函
- 派生类访问基类的私有成员
- c++类继承中的using声明,派生类中用using声明改变基类成员的访问权限
- 派生类可以访问基类的private成员吗
- 基类和派生类的成员访问
- C++派生类对象访问基类的protected成员
- C++ - 派生类访问模板基类(templatized base class)命名
- 继承与派生:派生类对基类成员的访问控制之保护继承与私有继承
- 用基类指针创建的派生类对象,无法访问派生类对象的数据和成员
- 第13周-项目1-基类中成员的访问限定符和派生类的继承方式
- 《C++第十二周实验报告1-1》----理解基类中成员的访问限定符和派生类的继承方式
- 鸡啄米:C++编程入门系列之三十七(继承与派生:派生类对基类成员的访问控制之公有继承)
- 基类成员在派生类中的访问属性
- [导入]派生类对基类成员的访问权限
- 三十八、继承与派生:派生类对基类成员的访问控制之保护继承与私有继承
- 继承与派生:派生类对基类成员的访问控制之公有继承