永发信息网

关于C++虚拟函数的问题

答案:4  悬赏:0  手机版
解决时间 2021-01-23 16:03
#include "iostream.h"

class Base
{
public:
virtual Base* afn()
{
cout<<"This is Base class.\n";
return this;
}
};

class SubClass:public Base
{
public:
virtual SubClass* afn() //实为虚拟函数
{
cout<<"This is SubClass. \n";//问题overriding virtual function differs from 'Base::afn' only by return type or calling convention
return this;
}
};

void test (Base& x)
{
Base* b;
b=x.afn();
}

void main()
{
Base bc;
SubClass sc;
test(bc);
test(sc);
}
我是按照书上写的 不知道为什么会有错误 请高手指点!
这个不是函数重载的问题,而是虚函数的另一个种写法。
最佳答案
virtual SubClass* afn()

这个你要是把afn函数里面+个参数还可以实现一下函数的的重载

如果是你这样不能实现函数的重载,因为重载函数不以返回值来区分.

把virtual SubClass* afn() 改为:

virtual Base * afn()或者Base * afn()都可以

建议你去看一下虚函数的作用;

下面是我跟你改的个简单一点的虚函数的作用:

#include "iostream.h"

class Base
{
public:
virtual void afn()
{
cout<<"This is Base class.\n";

}
};

class SubClass:public Base
{
public:
virtual void afn()
{
cout<<"This is SubClass. \n";

}

};

void test (Base& x)
{
x.afn();
}

void main()
{
Base bc;

SubClass sc;

test(bc);

test(sc);

}
全部回答
#include "iostream.h" class Base { public: Base* afn() { cout<<"This is Base class.\n"; return this; } }; class SubClass:public Base { public: virtual SubClass* afn() //实为虚拟函数 { cout<<"This is SubClass. \n";//问题overriding virtual function differs from 'Base::afn' only by return type or calling convention return this; } }; void test (Base& x) { Base* b; b=x.afn(); } void main() { Base bc; SubClass sc; test(bc); test(sc); } 你 class Base { public: virtual Base* afn() { cout<<"This is Base class.\n"; return this; } 函数Base* afn()前的 virtual是没有意义的呀 它只对其父类起作用的 而此时Base本身就是基类了其上没有父类 不信你把他删掉试试
1.overriding virtual function differs from 'Base::afn' only by return type or calling convention 。 这句话的意思是告诉你函数的重载不能仅仅只靠返回值来区别。很显然编译器把你的用法当作了函数重载。 如果你的目的是实现多态,那么请将SubClass里面的虚函数返回值类型改为Base*。
int:整型,整型变量表示整数。   在ms dos上,每个整型变量分配 16 bit 存储空间。整型又分成两类,一类表示有符号整数,用 1 bit 表示符号,15 bit 表示数值,可表示数值范围为 -32768 至 32767。一类表示无符号整数,16 bit 都表示数值,可表示数值范围为 0 至 65535。数值都用二进制存储。例如:int a; unsigned int date; 等。   十进制整型常量直接写数字,如:5,100 等;八进制整型常量数字前加 0,如:05,0100 等;十六进制整型常量数字加 0x,如:0x5,0x100 等。   short:短整型,也可写成 short int,在ms dos上,与整型相同。   long:长整型,也可写成 long int,表示较大的整数,在ms dos上,每个长整型变量分配 32 bit 存储空间。长整型也分成两类,一类表示有符号整数,用 1 bit 表示符号,31 bit 表示数值,可表示数值范围为 -2^31 至 2^31-1。一类表示无符号整数,32 bit 都表示数值,可表示数值范围为 0 至 2^32-1。数值都用二进制存储。   例如:long int a; unsigned long date; 等。   整型常量的值若超过了整型数范围,会自动被认为是长整型常量;整型常量也可以后加'l',强制置为长整型,如:5l,100l 等。   float:浮点型,近似表示实数,在ms dos上,每个浮点型变量分配 32 bit 存储空间。浮点型都是有符号的,可表示数值范围分为三段:-10^38 至 -10^-38, 0, 10^-38 至 10^38。数值都先化成指数,再用二进制存储。7 位有效数字。   例如:float x, y; 等。   浮点型常量可以写成小数形式,如 3.14159,也可以写成指数形式:1.2e12 (表示 1.2*10^12)。   double:双精度型,近似表示更大实数,在ms dos上,每个浮点型变量分配 64 bit 存储空间。双精度型都是有符号的,可表示数值范围分为三段:-10^308 至 -10^-308, 0, 10^-308 至 10^308。数值都先化成指数,再用二进制存储。7 位有效数字。   例如:double x, y; 等。   双精度型常量可以写成小数形式,如 3.14159,也可以写成指数形式:1.2e12 (表示1.2*10^12)。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
深华·汇金国际广场停车场(出入口)地址在
人们常用的扦插,嫁接等方法繁殖果树,同有性
王者荣耀改版老夫子和夏侯惇哪个好用 夏侯惇
参字几种读 音
茉莉花香江景酒店停车场(出入口)地址好找么,
怀孕初期子宫内膜厚度正常是多少?
The think they can help us play sports(改
常用工业企业会计分录大全?
下列各组词语中,没有错别字的一项是A. 啰嗦
黄山柏晶戴斯酒店停车场地址在哪,我要去那里
我的HP Officejet Pro 8620无法启动WEB服务,
徽商故里大酒店停车场(出口)地址在什么地方,
黄浦军校二期,校长蒋中正赠剑柄是黄铜的
龙口人最多的镇是哪个镇??
我是一名21岁女大学生,从小经历过几次在
推荐资讯
模电题目 。想知道波特图中对应的82dB是从何
脚气怎么根治偏方!!
下列各句中,划线的成语使用恰当的一项是A.余
东洲花园停车场(园洲大道1463号附近东洲花园
胚芽鞘产生生长素的部位,感受单侧光刺激的部
我头十年前不小心打死了黄皮子今天进我家屋一
奇瑞汽车眉山超越仁寿直营店地址有知道的么?
请问尖沙咀和佐敦地铁站哪个离香港皇家太平洋
为什么1600x超频之后cpuz是3.9 任务管理器是3
为什么在昆明地区(整个云南是不是,我不知道)
复恐匆匆说不尽,行人临发又开封的 诗意
2016陕西单招学校哪个学校有食品检测专业
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?