不同的多态行为示例,C++与C#

eh57zj3b  于 2023-03-25  发布在  C#
关注(0)|答案(1)|浏览(143)

我在C++中尝试了下面的例子。我明白了从CA类中重新定义Method4(),在CB中使用Method4(int a),仅从可见性的Angular 隐藏Method4(),而不是从VMT的Angular 。因此,Main函数中的前2个调用不起作用。

class CA
{
public:
    virtual void Method1() { }
    virtual void Method2() { }
    virtual void Method3() { }
    virtual void Method4() { }
};

class CB : public CA
{
public:
    void Method1() { }
    void Method2() { }
    void Method4(int a) { }
};

int main()
{
    CB b1;
    b1.Method4();   // IT'S NOT WORKING (I EXPECTED)
    
    CB* b2 = new CB;
    b2->Method4();  // IT'S NOT WORKING (I EXPECTED)
    
    CA* a = new CB; 
    a->Method4();   // IT'S WORKING (I EXPECTED) 

    return 0;
}

我试着用C#重现这个例子。令我惊讶的是,下面的调用完全可以。

CB b1 = new CB(); // I EXPECTED NOT TO WORK, BUT IT DOES WORK
b1.Method4();

我的问题是,为什么?这是两种语言之间真实的的区别还是我遗漏了什么?
根据你的建议,我添加了下面的C#代码:

public class CA
{
    public virtual void Method1() { }
    public virtual void Method2() { }
    public virtual void Method3() { }
    public virtual void Method4() { }
}

public class CB : CA
{
    public override void Method1() { }
    public override void Method2() { }
    public void Method4(int a) { }
}

public static void Main()
{
    CB b = new CB(); // IT'S WORKING (I DIDN'T EXPECT THIS)
    b.Method4();
}
2nc8po8w

2nc8po8w1#

我理解从CA类中重新定义Method4(),CB中的Method4(int a)隐藏了Method4()
Method4()Method4(int a)有不同的签名,所以为了继承,它们就像不同的方法。
在C#中有一个隐藏的概念,但它是不同的:

class CA{
    public void Method(){Console.WriteLine("CA");}
}
class CB : CA{
    public new void Method(){Console.WriteLine("CB");}
}

在这种情况下,被调用的方法将依赖于引用的类型。因此CB.Method将“隐藏”CA.Method。这是通过new关键字显式实现的,省略此关键字将生成警告。

相关问题