将派生类引用传递给基类引用

Posted

技术标签:

【中文标题】将派生类引用传递给基类引用【英文标题】:Pass a derived class reference to a base class reference 【发布时间】:2012-08-18 12:34:48 【问题描述】:

这是否意味着从派生类调用基类,就像构造函数三角形会调用基类一样?

class Shape 
public int width, height;
 public Shape(int x)  
    width = height = x; 
     


class Triangle : Shape  
 public string style;
  public Triangle(int x) : base(x)  
    style = "isosceles";  
   

【问题讨论】:

你的问题到底是什么? 【参考方案1】:

是的,它将指示运行时在 Triangle 之前调用基本 Shape 构造函数。

逻辑按以下顺序执行:

    执行形状(int x) 执行三角形(int x)

因此,如果你有不同的构造函数重载,你可以直接调用它们。另请注意,如果您的基类有一个无参数构造函数,那么如果您没有指定一个,则本质上会添加一个隐式的base()。这意味着如果您的基类没有有无参数构造函数,那么所有子类必须在它们的构造函数中创建一个有效的base(...parameters...)

此外,您可以使用 this() 代替 base 来定位当前子类的构造函数。

public class MyBaseClass

    public MyBaseClass()
    
        Console.WriteLine("MyBaseClass Parameterless");
    

    public MyBaseClass(string message)
    
        Console.WriteLine("MyBaseClass Message: " + message);
    


public class MySubClass

    public MySubClass()
    
        Console.WriteLine("MySubClass Parameterless");
    

    public MySubClass(string message)
        : base(message)
    
        Console.WriteLine("MySubClass Message: " + message);
    

    public MySubClass(bool someUselessFlag)
        : this()
    
        Console.WriteLine("MySubClass bool someUselessFlag constructor");
    

输出将是:

var a = new MySubClass();
//outputs:
//MyBaseClass Parameterless
//MySubClass Parameterless

var b = new MySubClass("Hello World!");
//outputs:
//MyBaseClass Message: Hello World!
//MySubClass Message: Hello World!

var c = new MySubClass(true);
//outputs:
//MyBaseClass Parameterless
//MySubClass Parameterless
//MySubClass bool someUselessFlag constructor

构造函数自连,直到最终调用Object() 基本构造函数。这就是var c = new MySubClass(true) 调用两个以上构造函数的原因。

【讨论】:

为什么在第三个构造函数“var c = new MySubClass(true);”的情况下调用了两个无参数构造函数? 第一个 this() 调用将其链接到 MySubClass(),而后者又将其隐式链接到 base(),即 MyBaseClass()。构造函数可以链接多次,直到最终调用到Object() 我认为这是对 OP 问题的不幸误解。【参考方案2】:

借助 Herbert Schildt 的 C# 4.0 - The Complete Reference 一书。我会试着回答这个问题。我认为这个问题的例子是不完整的。如果在阅读 Herbert Schildt 的一本 C# 书籍时提出了这个问题。那么例子可能是这样的:

class Shape

    public int width, height;
    public Shape(int x)
    
        width = height = x;
    

    public Shape(Shape shape)
    
        width = shape.width;
        height = shape.height;
    


class Triangle : Shape

    public string style;
    public Triangle(int x)
        : base(x)
    
        style = "isosceles";
    
    public Triangle(Triangle triangle)
        : base(triangle)
    
        style = triangle.style;
    


class Draw

    static void Main()
    
        Triangle triangle1 = new Triangle(5);
        Triangle triangle2 = new Triangle(triangle1);
    

这里 Triangle 的第二个构造函数接收一个 Triangle 对象并将其传递给作为基类型的 Shape 构造函数。这是将派生类引用传递给基类引用的示例。有关更多信息,请参阅第 299 页 Herbert Schildt's book.

【讨论】:

以上是关于将派生类引用传递给基类引用的主要内容,如果未能解决你的问题,请参考以下文章

无法将指向派生类函数的指针传递给基类

c ++:将指针传递给基类时访问派生类方法?

将派生类传递给基类参数的函数

最佳实践:将派生类的向量传递给基类向量上的方法

在基类方法中引用继承类?

基类与派生类转换-引用赋值