C++中允许的函数在C#中是不允许的
Function that is allowed in C++ is not allowed in C#?
在C++中,我们可以这样做(伪代码):
class A {
public:
virtual void a(A a)=0;
}
class B : A {
public:
virtual void a(B b);
}
但是当我在C#中写等价物时:
public abstract class A
{
public virtual void a(A a){}
}
public class B : A
{
public override void a(B b){}
}
编译器给出一个错误,说B.a没有覆盖a.a。为什么C#不允许这样做?允许这种做法是非常合理的,因为它遵循多态性的原则。
C++版本的代码也不会覆盖该方法。但是,由于C++没有override
关键字cco,因此不会出现错误,因为编译器不知道您打算重写该方法。
如果您希望C#中的行为与C++中的行为相同,您可以删除override
关键字并将其替换为new
。
在C++11中确实如此,但我假设你没有使用它,否则你会出错。
允许这种做法是非常合理的,因为它遵循多态性的原则。
不,不是。考虑一下:
A a = new B();
a.a(new A());
如果B.a
覆盖A.a
,则上面的代码将使用参数new A()
调用B.a
。但是B.b
采用类型为B
的参数,所以这不起作用。
相关文章:
- 为什么 Clang 不允许"and"作为函数名称?
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 不允许运算符 const 参数调用 const 成员函数
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 函数 C::add() 中不允许将'C *'隐式转换为'A *'
- antlr cpp target 的标头部分不允许使用具有默认参数的外部函数
- 为什么不允许自动作为函数参数?
- 为什么函数返回类型中不允许参数推导?
- 这里不允许函数定义:void encryption(ifstream encrypt_file,ofstream key
- C 的基本原理不允许函数阵列
- 不允许函数模板部分专用化'swap<T>'
- 为什么类中不允许函数模板专业化
- 为什么c++标准不允许函数模板部分特化
- 为什么c++不允许函数参数作为默认值使用后一个参数