声明没错,是重载,不会覆盖基类的的virtual void fn(),如果在你的派生类中要用fn()那么你还要在你的派生类中实现void fn(),因为这个函数在机类是个虚函数。
这样的声明是错误的。
void fn(int)既然括号里有数据类型,怎么能没有变量呢,那内部调用这个变量是干什么的?
它如果改成void fn(int m)就正确了,会与void fn() 发生重载,会覆盖基类中的虚函数virtual void fn()
声明是告诉编译器一些信息,以协助编译器进行语法分析,避免编译器报错。而定义是告诉编译器生成一些代码,并且这些代码将由连接器使用。即:声明是给编译器用的,定义是给连接器用的。这个说明显得很模糊,为什么非要弄个声明和定义在这搅和?那都是因为C++同意将程序拆成几段分别书写在不同文件中以及上面提到的编译器只从上朝下编译且对每个文件仅编译一次。
编译器编译程序时,只会一个一个源文件编译,并分别生成相应的中间文件(对VC就是.obj文件),然后再由连接器统一将所有的中间文件连接形成一个可执行文件。问题就是编译器在编译a.cpp文件时,发现定义语句而定义了变量a和b,但在编译b.cpp时,发现使用a和b的代码,如a++;,则编译器将报错。为什么?如果不报错,说因为a.cpp中已经定义了,那么先编译b.cpp再编译a.cpp将如何?如果源文件的编译顺序是特定的,将大大降低编译的灵活性,因此C++也就规定:编译a.cpp时定义的所有东西(变量、函数等)在编译b.cpp时将全部不算数,就和没编译过a.cpp一样。那么b.cpp要使用a.cpp中定义的变量怎么办?为此,C++提出了声明这个概念。
因此变量声明long a;就是告诉编译器已经有这么个变量,其名字为a,其类型为long,其对应的地址不知道,但可以先作个记号,即在后续代码中所有用到这个变量的地方做上记号,以告知连接器在连接时,先在所有的中间文件里寻找是否有个叫a的变量,其地址是多少,然后再修改所有作了记号的地方,将a对应的地址放进去。这样就实现了这个文件使用另一个文件中定义的变量。
所以声明long a;就是要告诉编译器已经有这么个变量a,因此后续代码中用到a时,不要报错说a未定义。函数也是如此,但是有个问题就是函数声明和函数定义很容易区别,因为函数定义后一定接一复合语句,但是变量定义和变量声明就一模一样,那么编译器将如何识别变量定义和变量声明?编译器遇到long a;时,统一将其认为是变量定义,为了能标识变量声明,可借助C++提出的修饰符extern。
覆盖基类的的virtual void fn(),如果在你的派生类中要用fn()那么你还要在你的派生类中实现void fn()
这样的声明是错误的。
void fn(int)既然括号里有数据类型,怎么能没有变量呢,那内部调用这个变量是干什么的?
它如果改成void fn(int m)就正确了,会与void fn() 发生重载,会覆盖基类中的虚函数virtual void fn()
捡到的幸福说的对
隐藏