关于virtual
#include <iostream.h>
class Base
{
public:
virtual void fn(int x)
{
cout < < "In Base class,int x = " < <x < <endl;
}
};
class SubClass:public Base
{
public:
virtual int fn(int x)
{
cout < < "In SubClass,float x = " < <x < <endl;
return 0;
}
};
void test(Base& b)
{
int i = 1;
b.fn(i);
}
void main()
{
Base bc;
SubClass sc;
cout < < "Calling test(bc) \n ";
test(bc);
cout < < "Calling test(sc) \n ";
test(sc);
}
为什么这个程序通不过编译?
我知道上面两种情况下都是先期联编,我不是想知道运行结果为什么没有出现 "In SubClass,float x = ".而是想知道:
若将SubClass类中的virtual int fn(int x)改为virtual void fn(float x),并去掉返回语句return 0;可以编译通过,这种情况下加不加virtual是一样的.但是为什么上面的程序中,加virtual编译通不过,不加却可以通过,不应该是一样的吗?
即:为什么父类和子类的成员函数参数不同时,加不加virtual是一样的;但返回类型不同,参数相同时,不加virtual可以通过编译,加了却不能通过编译?
[解决办法]
用的啥编译器?
再换几个编译器试一下。这种问题,你必须先排除编译器的个体行为。
[解决办法]
#include <iostream.h>
...
void main()
...
很显然楼主用的是VC6。我现在只有VC7.1的命令行工具,加不加virtual都出错。
[解决办法]
应该是编译器的问题!
你的编译器在实现虚函数时会去额外检查返回值是否相同,因此报错!
注意,参数类型是会参与编译时的名字修饰的!对这点你应该深入理解一下!
建议仔细学习下函数重载的机制,这个问题就不难理解了!
[解决办法]
class Base
{
public:
virtual void fn(int x)
{
cout < < "In Base class,int x = " < <x < <endl;
}
};
class SubClass:public Base
{
public:
virtual int fn(int x)
{
cout < < "In SubClass,float x = " < <x < <endl;
return 0;
}
};
------------------------------
我感觉编译器拒绝你
是正确的
虽然这个不时重载的问题(作用域不同)
但是我们仔细思考一下
他们去掉那层继承的关系
这样同样会引来编译器的混淆(重载机制,仅是返回值不同,不能构成重载)