我在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();
}
1条答案
按热度按时间2nc8po8w1#
我理解从CA类中重新定义Method4(),CB中的Method4(int a)隐藏了Method4()
Method4()
和Method4(int a)
有不同的签名,所以为了继承,它们就像不同的方法。在C#中有一个隐藏的概念,但它是不同的:
在这种情况下,被调用的方法将依赖于引用的类型。因此CB.Method将“隐藏”CA.Method。这是通过
new
关键字显式实现的,省略此关键字将生成警告。