首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于virtual解决办法

2012-03-08 
关于virtual#includeiostream.hclassBase{public:virtualvoidfn(intx){cout InBaseclass,intx

关于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;
}
};

------------------------------

我感觉编译器拒绝你
是正确的
虽然这个不时重载的问题(作用域不同)
但是我们仔细思考一下
他们去掉那层继承的关系
这样同样会引来编译器的混淆(重载机制,仅是返回值不同,不能构成重载)

热点排行
Bad Request.