永发信息网

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

答案:4  悬赏:0  手机版
解决时间 2021-01-23 16:03
  • 提问者网友:骨子里的高雅
  • 2021-01-22 20:53
#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);
}
我是按照书上写的 不知道为什么会有错误 请高手指点!
这个不是函数重载的问题,而是虚函数的另一个种写法。
最佳答案
  • 五星知识达人网友:拜訪者
  • 2021-01-22 21:09
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);

}
全部回答
  • 1楼网友:纵马山川剑自提
  • 2021-01-22 23:40
#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本身就是基类了其上没有父类 不信你把他删掉试试
  • 2楼网友:不如潦草
  • 2021-01-22 23:24
1.overriding virtual function differs from 'Base::afn' only by return type or calling convention 。 这句话的意思是告诉你函数的重载不能仅仅只靠返回值来区别。很显然编译器把你的用法当作了函数重载。 如果你的目的是实现多态,那么请将SubClass里面的虚函数返回值类型改为Base*。
  • 3楼网友:廢物販賣機
  • 2021-01-22 22:20
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)。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯