- 主题:子类重写父类的函数,为什么会将父类所有的同名函数覆盖
如题,为什么呢?
- 来自 水木社区APP v3.4.0
--
FROM 123.112.70.*
我觉得这应该是函数重载的一种形式。实际调用的时候编译器会去找最匹配的那个函数。如果我用C的形式描述成员函数的话,那就是:
T Base::func(args...) => T func(Base *,args...)
T Sub::func(args...) => T func(Sub *,args...)
实际上父类的函数并没被覆盖掉,你如果用 (Base*)(&subobj)->func(args...) 的话,调用的还是父类的成员函数。
多态的虚函数又是另外一回事了,这个是运行时判断类型的,用C描述的话,obj_ptr->func(args...) 实际执行的是类似 obj_ptr->vtable->func(obj_ptr,args...) 的代码。
【 在 yml123 (layamon) 的大作中提到: 】
: 如题,为什么呢?
: - 来自 水木社区APP v3.4.0
--
FROM 123.112.71.*
你想问的是,为什么C++要这么设计,对吧?
按我的理解,C++函数重载里需要找最匹配的函数。
考虑以下场景:
父类foo(#1) foo(#2)
调用父类函数匹配到foo(#1)
现在如果一个子类重写了父亲的foo(#2),用子类对象调用foo,是匹配到父类的foo(#1)呢还是匹配到子类的foo(#2)呢?
前者符合参数最匹配原则,后者则符合调用者字面的意思。
于是这里就产生了一个模糊点。
这个规则正是为了理清这个模糊点。
从好的设计角度讲,要避免出现这种情况。
* 继承绝大多数时候应该只用在is-a关系
* 子类重写父类是一个应该尽量避免的模式
* 同名函数重载不要随便滥用。
【 在 yml123 的大作中提到: 】
: 如题,为什么呢?
: - 来自 水木社区APP v3.4.0
--
FROM 76.126.252.*