你不是写的dmyclass()吗,d是Program类的,当然输出1了,baseclass才是2,要是你写fmyclass()就输出2啦。
这个,,你的baseclass和Program是不是写反了啊,被继承的才是baseclass呢。。
1、重定义new:派生类对基类的成员函数重新定义,即派生类定义了某个函数。该函数的名字与基类中的函数名字一样。
特点:1、不在同一个作用域,分别位于基类、派生类;2、函数的名字必须相同; 3、对函数的返回值、形参列表无要求
特殊情况:若派生类定义的该函数与基类的成员函数完全一样。返回值、形参列表均相同,且基类的该函数为virtual,则属于派生类重写基类的虚函数。
作用效果:若重新定义了基类中的一个重载函数。则在派生类中,基类中该名字的函数,即其他所有重载版本,都被自动隐藏,包括同名的虚函数。
2、重载:overload:函数名字相同,但它的形参个数或者顺序,或者类型不同,但是不能靠返回类型来判断。
特点:1、位于同一个类中;2、函数的名字必须相同;3、形参列表不同可能是参数个数 or 类型 or 顺序 不同,返回值无要求
特殊情况:若某一个重载版本的函数前面有virtual修饰,则表示它是虚函数。但它也是属于重载的一个版本
作用效果和原理:编译器根据函数不同的参数表将函数体与函数调用进行早绑定。重载与多态无关,只是一种语言特性,与面向对象无关。
3、重写override:派生类重定义基类的虚函数,即会覆盖基类的虚函数
特点:1、不在同一个作用域,分别位于基类、派生类;2、函数名、形参列表、返回值相同;3、基类的函数是virtual
特殊情况:若派生类重写的虚函数属于一个重载版本,则该重写的函数会隐藏基类中与虚函数同名的其他函数。
故:
在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。 是对的。
不管啥编程语言, 总是要遵循单一定义原则, 重定义就是编译错误 C++的虚函数应该说是overwrite, 一般说成重写或者覆盖 新手不要和自己玩文字游戏, 纠结这些没多大意义
一旦一个函数被声明为虚函数,那么他从该点之后的继承层次结构中都是虚函数,不管它在有没有再次声明是不是虚函数,有些程序员为了提高程序的清晰度,在继承结构中喜欢再次明确的声明这些虚函数
至于“判定覆盖的依据是两者都是虚函数,发生在派生类与基类之间。”只是解释了什么是覆盖,派生类将基类中的虚函数重写即为覆盖。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)