using System;
class Base
{
public Base()
{
Console.WriteLine("BASE 1");
}
public Base(int x)
{
Console.WriteLine("BASE 2");
}
}
class Derived : Base
{
public Derived():base(10)
{
Console.WriteLine("DERIVED CLASS");
}
}
class MyClient
{
public static void Main()
{
Derived d1 = new Derived();
}
}
public class MyBase
{
public MyBase()
{
Console.WriteLine("MyBase");
}
}
public class MyDerived : MyBase
{
public MyDerived():base()
{
Console.WriteLine("MyDerived");
}
}
public class BaseClass {
private string sentenceOne = null; // A
public BaseClass() {
sentenceOne = "The quick brown fox"; // B
}
}
public class SubClass : BaseClass {
private string sentenceTwo = null; // C
public SubClass() {
sentenceTwo = "jumps over the lazy dog"; // D
}
}
构造函数调用是从下往上调用(激发) ,并从上往下执行。因此,如果 C 类从 B 类继承,B 类从 A 类继承,当你创建一个 C 类的实例时,C 类的构造函数被调用,C 类的构造函数又调用 B 类的指导函数,B 类的指导函数又调用 A 类的构造函数。现在执行 A 的构造函数,然后执行 B 的构造函数,然后执行 C 的构造函数。
不要试图记住它,试着向自己解释将要发生的事情。假设您有一个名为 Animal 的基类和一个名为 Dog 的派生类。派生类向基类添加一些功能。因此,当执行派生类的构造函数时,基类实例必须是可用的(以便您可以向其添加新功能)。这就是为什么构造函数从基函数执行到派生函数,而析构函数却以相反的方式执行——首先是派生函数,然后是基函数。
using System;
class A
{
public A() {
PrintFields();
}
public virtual void PrintFields() {}
}
class B: A
{
int x = 1;
int y;
public B() {
y = -1;
}
public override void PrintFields() {
Console.WriteLine("x = {0}, y = {1}", x, y);
}
}
using System;
using System.Collections;
class A
{
int x = 1, y = -1, count;
public A() {
count = 0;
}
public A(int n) {
count = n;
}
}
class B: A
{
double sqrt2 = Math.Sqrt(2.0);
ArrayList items = new ArrayList(100);
int max;
public B(): this(100) {
items.Add("default");
}
public B(int n): base(n – 1) {
max = n;
}
}