学前端的想请教两个C++问题,求帮助!

xinfucheng 2013-11-11 06:03:14
在父类中定义一个方法method1有两个参数a和b都是String类型,子类继承父类后,子类又重定义了method1,同时定义了三个参数a,b,c也都是String类型,当实例化子类实例出obj后, 调用obj.method1('aaa','bbb'),会调用父类的method1还是子类的method1? 这个是不是就叫子类的方法重载父类的方法?

那里氏替换原则里的一句话:
“当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。”

这个更宽松是什么意思啊?
...全文
155 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lunat 2013-11-11
简直误人子弟! 这种问题问别人不如自己试试,运行结果不会欺骗你! 相信错误的答案不如不知道答案! C++子类实现父类的virtual函数,参数列表必须完全相同,不存在任何宽松,只有返回值可以不同(返回值类型可以是父类返回值类型的子类)!
回复
lunat 2013-11-11
在C++中,如果要通过继承实现多态,函数参数类型必须完全一样(),返回值、异常抛出(后置条件)可以是父类的子集。
引用 4 楼 caozhy 的回复:
所谓参数宽松,说的是类型,可以是它的基类(扩大了范围,比如说父类要求传一个中国人,那么子类可以要求是传一个人,但是不能是一个北京人),不是参数。 道理也很容易想明白,当你调用一个派生类的时候,有可能不知道派生类定义的类型(否则继承就没有意义了),而只知道基类的类型。所以我们希望只要符合了基类的编程接口的调用,对它的子类也一定是合理的。 比如说我们如果允许一个中国人会写汉字,那么对于一个中国人的派生类(比如北京人),我们毫不怀疑地认为他肯定也会写汉字。
回复
xinfucheng 2013-11-11
同样谢谢wahaha_1986
回复
xinfucheng 2013-11-11
引用 9 楼 dyw 的回复:
自己对疑惑的地方做个测试,看看它是如何工作的。有时,死扣文字去理解很费劲,尤其是翻译过来的文字。
我是学习js前端的,C++代码没写过,就是现在学习设计原则时,看了基本都是以C++为例子描述的,所以想大致了解一下是咋回事? 现在看动态语言和静态的差别很大,主要静态是以接口编程,很多知识都是挂在这上面的,而js不需要考虑这些。。。所以学着很费劲
回复
xinfucheng 2013-11-11
谢谢 caozhy版主,ri_aje ,u011680671 仔细看了帖子,我现在基本清楚了,再次感谢三位
回复
wahaha_1986 2013-11-11
引用 8 楼 u011680671 的回复:
struct Base { virtual void method1(string a, string b) { } }; struct Derived : public Base { virtual void method1(string a, string b, string c) { } }; void main() { Derived d; d.method1("a", "b"); } 很遗憾,函数重载不能跨越类的作用域,Derived的method1与Base的method1不构成重载,Derived的method1重写了Base的method1,因此编译器将会提示:Derived::method1”: 函数不接受 2 个参数。
补充点自己的认识: 1.基类方法的参数和派生类方法的参数个数不一样,那么派生类方法就对基类方法实现了方法“隐藏”(也叫方法“覆盖”),就是说你无法调用基类方法的,所以编译出错。 2.基类方法的参数和派生类方法的参数个数一样,但形参类型不一样,这个应该就是你所说的方法“重载”,那里氏替换原则版主解释得很清楚了。 3.基类方法的参数和类型和派生类中都一样,这个叫方法“重写”(最常用的情况),调用哪个方法由实例类型决定。
回复
dyw 2013-11-11
自己对疑惑的地方做个测试,看看它是如何工作的。有时,死扣文字去理解很费劲,尤其是翻译过来的文字。
回复
斗酒神僧 2013-11-11
struct Base { virtual void method1(string a, string b) { } }; struct Derived : public Base { virtual void method1(string a, string b, string c) { } }; void main() { Derived d; d.method1("a", "b"); } 很遗憾,函数重载不能跨越类的作用域,Derived的method1与Base的method1不构成重载,Derived的method1重写了Base的method1,因此编译器将会提示:Derived::method1”: 函数不接受 2 个参数。
回复
threenewbee 2013-11-11
你不懂等于我白说了。我继续举例: class 中国人 { public: virtual void 阅读(中文报纸 newspaper) { ... } } class 北京人 : 中国人 { public: void 阅读(? newspaper) { ... } } 现在我问你,这个?可以写什么参数? 我们可以写中文报纸,也可以写中英文报纸(假设北京人文化程度比较高,个个会英文,开个玩笑) 能不能写北京日报啊?也就是参数类型更“严格”。 如果那么写,我们就不能保证基于中国人类型,对北京人的“阅读”方法的调用都符合参数要求了。
回复
ri_aje 2013-11-11
引用 3 楼 xinfucheng 的回复:
[quote=引用 2 楼 ri_aje 的回复:] 调用子类的函数。
为什么不是父类的那个啊 子类的参数不匹配啊[/quote] 我根据你的描述,觉得子类的参数匹配。 现在你说不匹配,最好把代码发上来,看一下到底什么样。
回复
xinfucheng 2013-11-11
一下还搞不懂,谢谢caozhy版主
回复
threenewbee 2013-11-11
所谓参数宽松,说的是类型,可以是它的基类(扩大了范围,比如说父类要求传一个中国人,那么子类可以要求是传一个人,但是不能是一个北京人),不是参数。 道理也很容易想明白,当你调用一个派生类的时候,有可能不知道派生类定义的类型(否则继承就没有意义了),而只知道基类的类型。所以我们希望只要符合了基类的编程接口的调用,对它的子类也一定是合理的。 比如说我们如果允许一个中国人会写汉字,那么对于一个中国人的派生类(比如北京人),我们毫不怀疑地认为他肯定也会写汉字。
回复
xinfucheng 2013-11-11
引用 2 楼 ri_aje 的回复:
调用子类的函数。
为什么不是父类的那个啊 子类的参数不匹配啊
回复
ri_aje 2013-11-11
调用子类的函数。
回复
threenewbee 2013-11-11
莫名其妙,一个两个参数一个三个参数,无论怎么定义的,只能是两个结果,要么是编译器提示找不到方法,要么就是调用参数个数匹配的那个。 至于是哪一种情况,要看你说的“定义”是怎么定义的。
回复
相关推荐
发帖
C++ 语言
创建于2007-09-28

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2013-11-11 06:03
社区公告
暂无公告