大虾帮忙指点下,关于派生类和虚函数的

boxiaoliao 2014-07-30 05:51:36
在看C++ PRIMER,里面说,如果基类定义了一个虚函数,一般来说,派生类需重新定义这个虚函数,尽管不是必须的
但实际上我遇到了这么一个问题
//base
class protocol
{
public:
virtual void breadgateway();
}
// derived A
class protocol1281:public protocol
{
public:
virtual void breadgateway();
}
// derived B
class protocol1291:public protocol
{
}

子类B没有定义breadgateway,为啥编译通不过?protocol1291补上该函数OK
用的是vc++ 6.0
...全文
311 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 2014-11-04
  • 打赏
  • 举报
回复
如果你学标准的C++,建议你别用VC6.0,离标准C++太远了,并且有很多的bug。 珍惜生命,远离VC6
勤奋的小游侠 2014-07-31
  • 打赏
  • 举报
回复
引用 17 楼 boxiaoliao 的回复:
[quote=引用 15 楼 lovesmiles 的回复:] 看你的link错误和你发的代码 是两个不同的函数? virtual void breadgateway(); virtual void breadgateway(vector<GateWaySysInfo>);
抱歉,昨天只是手写过来的,图方便,所以没写函数参数 实际情况是,所有breadgateway的声明都是virtual bool bReadGateWay(vector<gatewaysysinfo> &gatewaysys)[/quote] 这是一个连接错误,并非编译错误。我有点怀疑你的基类可能没有写它的实现。能不能把完整的代码发上来?别自己过滤掉问题。
boxiaoliao 2014-07-31
  • 打赏
  • 举报
回复
引用 15 楼 lovesmiles 的回复:
看你的link错误和你发的代码 是两个不同的函数? virtual void breadgateway(); virtual void breadgateway(vector<GateWaySysInfo>);
抱歉,昨天只是手写过来的,图方便,所以没写函数参数 实际情况是,所有breadgateway的声明都是virtual bool bReadGateWay(vector<gatewaysysinfo> &gatewaysys)
boxiaoliao 2014-07-31
  • 打赏
  • 举报
回复
引用 14 楼 lovesmiles 的回复:
[quote=引用 13 楼 boxiaoliao 的回复:] [quote=引用 3 楼 pb830 的回复:] 先得发出错提示吧……
Linking... LINK : warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library protocol1291.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall Cprotocol1291::bReadGateWay(class std::vector<struct GateWaySysInfo,class std::allocator<struct GateWaySysInfo> > &)" (?bReadGateWay@Cprotocol1291@@UAE_NAAV?$vec tor@UGateWaySysInfo@@V?$allocator@UGateWaySysInfo@@@std@@@std@@@Z) C:\UserData\007\test\V6.5\DiagnosePC.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. Creating browse info file... 基类跟子类A都有定义的,1L我没写清楚,每个protocol都有个对应的.h和.cpp文件的[/quote] 你是不是定义了一个有参数的 virtual void breadgateway(vector<GateWaySysInfo>);[/quote] 嗯,每种protocol包括基类我都定义了,一模一样
勤奋的小游侠 2014-07-31
  • 打赏
  • 举报
回复
看你的link错误和你发的代码 是两个不同的函数? virtual void breadgateway(); virtual void breadgateway(vector<GateWaySysInfo>);
勤奋的小游侠 2014-07-31
  • 打赏
  • 举报
回复
引用 13 楼 boxiaoliao 的回复:
[quote=引用 3 楼 pb830 的回复:] 先得发出错提示吧……
Linking... LINK : warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library protocol1291.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall Cprotocol1291::bReadGateWay(class std::vector<struct GateWaySysInfo,class std::allocator<struct GateWaySysInfo> > &)" (?bReadGateWay@Cprotocol1291@@UAE_NAAV?$vec tor@UGateWaySysInfo@@V?$allocator@UGateWaySysInfo@@@std@@@std@@@Z) C:\UserData\007\test\V6.5\DiagnosePC.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. Creating browse info file... 基类跟子类A都有定义的,1L我没写清楚,每个protocol都有个对应的.h和.cpp文件的[/quote] 你是不是定义了一个有参数的 virtual void breadgateway(vector<GateWaySysInfo>);
boxiaoliao 2014-07-31
  • 打赏
  • 举报
回复
引用 3 楼 pb830 的回复:
先得发出错提示吧……
Linking... LINK : warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library protocol1291.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall Cprotocol1291::bReadGateWay(class std::vector<struct GateWaySysInfo,class std::allocator<struct GateWaySysInfo> > &)" (?bReadGateWay@Cprotocol1291@@UAE_NAAV?$vec tor@UGateWaySysInfo@@V?$allocator@UGateWaySysInfo@@@std@@@std@@@Z) C:\UserData\007\test\V6.5\DiagnosePC.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe. Creating browse info file... 基类跟子类A都有定义的,1L我没写清楚,每个protocol都有个对应的.h和.cpp文件的
boxiaoliao 2014-07-31
  • 打赏
  • 举报
回复
引用 10 楼 xiaohuh421 的回复:
如果基类中的虚函数没有实现, 那么就是一个纯虚函数, 派生类就必需重写并实现. 否则不能编译通过. 如果你基类中对虚函数进行实现, 则派生类可实现, 可不实现. class protocol { public: virtual void breadgateway(){} //加{ } 即实现了函数体. 这时派生类就可现, 可不实现. }
学习了,我把编译发过来,是链接时的问题
boxiaoliao 2014-07-31
  • 打赏
  • 举报
回复
引用 7 楼 lisong694767315 的回复:
基类中的virtual void breadgateway();定义了吗??
定义了
xiaohuh421 2014-07-31
  • 打赏
  • 举报
回复
如果基类中的虚函数没有实现, 那么就是一个纯虚函数, 派生类就必需重写并实现. 否则不能编译通过. 如果你基类中对虚函数进行实现, 则派生类可实现, 可不实现. class protocol { public: virtual void breadgateway(){} //加{ } 即实现了函数体. 这时派生类就可现, 可不实现. }
KangRoger 2014-07-31
  • 打赏
  • 举报
回复
引用 楼主 boxiaoliao 的回复:
在看C++ PRIMER,里面说,如果基类定义了一个虚函数,一般来说,派生类需重新定义这个虚函数,尽管不是必须的 但实际上我遇到了这么一个问题 //base class protocol { public: virtual void breadgateway(); } // derived A class protocol1281:public protocol { public: virtual void breadgateway(); } // derived B class protocol1291:public protocol { } 子类B没有定义breadgateway,为啥编译通不过?protocol1291补上该函数OK 用的是vc++ 6.0
如果只是这样声明,不新建protocol1291对象,可以编译通过。 但是如果新建protocol1291肯定不行。因为在基类你声明了虚函数breadgateway,但是并没有定义。在新建继承类对象时,及类型对象会有个虚表指针,这个指针指向虚函数的的地址。函数breadgateway没有定义,自然没有地址,就会出错。 如果基类定义了一个虚函数,一般来说,派生类需重新定义这个虚函数,尽管不是必须的这句话没错,是定义一个虚函数,而不是声明。
SiGoYi 2014-07-31
  • 打赏
  • 举报
回复
如果就是上面几行代码的话,基类没有定义也是没有问题的。除了他创建了子类或基类的对象,编译器才会报错。不知道楼主专用明子类或基类的对象没有?
神奕 2014-07-31
  • 打赏
  • 举报
回复
基类中的virtual void breadgateway();定义了吗??
mujiok2003 2014-07-31
  • 打赏
  • 举报
回复
base中虚函数没有定义吗?
a707000646 2014-07-31
  • 打赏
  • 举报
回复
建议你参考一下 C++primer上的例子
勤奋的小游侠 2014-07-31
  • 打赏
  • 举报
回复
引用 26 楼 boxiaoliao 的回复:
[quote=引用 25 楼 lovesmiles 的回复:] [quote=引用 24 楼 boxiaoliao 的回复:] [quote=引用 18 楼 lovesmiles 的回复:] [quote=引用 17 楼 boxiaoliao 的回复:] [quote=引用 15 楼 lovesmiles 的回复:] 看你的link错误和你发的代码 是两个不同的函数? virtual void breadgateway(); virtual void breadgateway(vector<GateWaySysInfo>);
抱歉,昨天只是手写过来的,图方便,所以没写函数参数 实际情况是,所有breadgateway的声明都是virtual bool bReadGateWay(vector<gatewaysysinfo> &gatewaysys)[/quote] 这是一个连接错误,并非编译错误。我有点怀疑你的基类可能没有写它的实现。能不能把完整的代码发上来?别自己过滤掉问题。[/quote] 我去,我重新试下了 是我没弄明白问题 1291我有在.h里面声明,但是没有定义,所以链接不过 我把声明也屏蔽,OK! 什么道理?[/quote] 这是很明显的道,你在1291定义了函数,基类的同名函数就会被隐藏!你没有在1291对这个函数实现,肯定会出错! 基类函数被隐藏的规则你要好好看一下书才行。在子类声不声明同明函数是完全两种不同的意义的。即使虚函数也一样。[/quote] 意思是,如果我在派生类既不声明,也不定义,派生类会继承基类接口,我声明了,然后没定义,也无法继承基类接口,所以出错?[/quote] 是的,你既然在派生类又声明了,编译器就认为你不打算用基类的东西了,必须要自己再实现一个。
boxiaoliao 2014-07-31
  • 打赏
  • 举报
回复
引用 25 楼 lovesmiles 的回复:
[quote=引用 24 楼 boxiaoliao 的回复:] [quote=引用 18 楼 lovesmiles 的回复:] [quote=引用 17 楼 boxiaoliao 的回复:] [quote=引用 15 楼 lovesmiles 的回复:] 看你的link错误和你发的代码 是两个不同的函数? virtual void breadgateway(); virtual void breadgateway(vector<GateWaySysInfo>);
抱歉,昨天只是手写过来的,图方便,所以没写函数参数 实际情况是,所有breadgateway的声明都是virtual bool bReadGateWay(vector<gatewaysysinfo> &gatewaysys)[/quote] 这是一个连接错误,并非编译错误。我有点怀疑你的基类可能没有写它的实现。能不能把完整的代码发上来?别自己过滤掉问题。[/quote] 我去,我重新试下了 是我没弄明白问题 1291我有在.h里面声明,但是没有定义,所以链接不过 我把声明也屏蔽,OK! 什么道理?[/quote] 这是很明显的道,你在1291定义了函数,基类的同名函数就会被隐藏!你没有在1291对这个函数实现,肯定会出错! 基类函数被隐藏的规则你要好好看一下书才行。在子类声不声明同明函数是完全两种不同的意义的。即使虚函数也一样。[/quote] 意思是,如果我在派生类既不声明,也不定义,派生类会继承基类接口,我声明了,然后没定义,也无法继承基类接口,所以出错?
勤奋的小游侠 2014-07-31
  • 打赏
  • 举报
回复
引用 24 楼 boxiaoliao 的回复:
[quote=引用 18 楼 lovesmiles 的回复:] [quote=引用 17 楼 boxiaoliao 的回复:] [quote=引用 15 楼 lovesmiles 的回复:] 看你的link错误和你发的代码 是两个不同的函数? virtual void breadgateway(); virtual void breadgateway(vector<GateWaySysInfo>);
抱歉,昨天只是手写过来的,图方便,所以没写函数参数 实际情况是,所有breadgateway的声明都是virtual bool bReadGateWay(vector<gatewaysysinfo> &gatewaysys)[/quote] 这是一个连接错误,并非编译错误。我有点怀疑你的基类可能没有写它的实现。能不能把完整的代码发上来?别自己过滤掉问题。[/quote] 我去,我重新试下了 是我没弄明白问题 1291我有在.h里面声明,但是没有定义,所以链接不过 我把声明也屏蔽,OK! 什么道理?[/quote] 这是很明显的道,你在1291定义了函数,基类的同名函数就会被隐藏!你没有在1291对这个函数实现,肯定会出错! 基类函数被隐藏的规则你要好好看一下书才行。在子类声不声明同明函数是完全两种不同的意义的。即使虚函数也一样。
boxiaoliao 2014-07-31
  • 打赏
  • 举报
回复
引用 18 楼 lovesmiles 的回复:
[quote=引用 17 楼 boxiaoliao 的回复:] [quote=引用 15 楼 lovesmiles 的回复:] 看你的link错误和你发的代码 是两个不同的函数? virtual void breadgateway(); virtual void breadgateway(vector<GateWaySysInfo>);
抱歉,昨天只是手写过来的,图方便,所以没写函数参数 实际情况是,所有breadgateway的声明都是virtual bool bReadGateWay(vector<gatewaysysinfo> &gatewaysys)[/quote] 这是一个连接错误,并非编译错误。我有点怀疑你的基类可能没有写它的实现。能不能把完整的代码发上来?别自己过滤掉问题。[/quote] 我去,我重新试下了 是我没弄明白问题 1291我有在.h里面声明,但是没有定义,所以链接不过 我把声明也屏蔽,OK! 什么道理?
boxiaoliao 2014-07-31
  • 打赏
  • 举报
回复
引用 22 楼 lovesmiles 的回复:
class Cprotocol1291:public protocol class Cprotocol 这是什么和什么?明显不是同一个类
手写的,我错啦啦啦啦啦
加载更多回复(9)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧