sof*_*sof 0 c# c++ polymorphism inheritance
在C#中,基类的虚方法可以被其派生类覆盖或隐藏,例如
using System;
class A {
public virtual void M() {
System.Console.WriteLine("A");
}
}
class B: A {
public override void M() {
System.Console.WriteLine("B");
}
}
class C: A {
public new void M() {
System.Console.WriteLine("C");
}
}
class P {
static void Main(string[] args) {
A b = new B();
b.M();
A a = new C();
a.M();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
B
A
Run Code Online (Sandbox Code Playgroud)
在C++中怎么样?只能覆盖?
从C++ 11开始,您可以使用该override关键字告诉编译器您打算覆盖基类虚函数.
void foo() override;
Run Code Online (Sandbox Code Playgroud)
如果没有override关键字但基类包含具有相同*签名的虚函数,则该函数仍会被覆盖.否则,隐藏.
当然,您可以在C++中覆盖和隐藏虚函数.你只是不是很明确(不管怎么说都不是在C++ 03中).
例
class A
{
public:
virtual int f(char);
};
class B : public A
{
public:
virtual int f(); //hides A::f
};
class C : public A
{
public:
virtual int f(char); //overrides A::f
};
Run Code Online (Sandbox Code Playgroud)
如果签名与Base虚方法*重合,那么它将覆盖.否则它就藏起来了.
所以有时候你不小心忘记了一个const 并最终隐藏了这个函数而不是覆盖它.调用C++ 11覆盖属性来解决此问题.如果使用此覆盖属性但签名不兼容,则会出现编译器错误.
*(或不同之处仅在于返回类型分别是对Base类和公共Derived类的指针或引用)
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |