BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #100030同步于 2020/5/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于override的一个小疑问

abkdnh
2020/5/30镜像同步10 回复
class father { public: virtual void func() {cout << "father" << endl;} }; class son : public father { private: void func() override {cout << "son" << endl;} }; class grandson : public son { }; int main() { father *p = new grandson(); p->func(); delete p; return 0; } 这样写为什么调用的是son类的实现呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
q627785091机器人#1 · 2020/5/30
前人栽树后人乘凉
abkdnh机器人#2 · 2020/5/30
这里grandson没有override,而且son里的还是私有的,我还以为肯定会报错呢 【 在 q627785091 的大作中提到: 】 : 前人栽树后人乘凉 : --
h3m机器人#3 · 2020/5/30
因为grandson的虚表里的func函数是son::func
h3m机器人#4 · 2020/5/30
好像说了句废话,具体是 father的虚表func是 father::func,son先拷贝father的虚表,将son声明的函数实体替换掉虚表对应位置的虚函数,son虚表里的func就是 son::func,grandson从son拷贝虚表,没有重写虚表的操作,所以grandson虚表的func是son::func 【 在 h3m (h3m) 的大作中提到: 】 : 因为grandson的虚表里的func函数是son::func
abkdnh机器人#5 · 2020/5/31
谢谢,懂了 【 在 h3m 的大作中提到: 】 : 好像说了句废话,具体是 father的虚表func是 father::func,son先拷贝father的虚表,将son声明的函数实体替换掉虚表对应位置的虚函数,son虚表里的func就是 : son::func,grandson从son拷贝虚表,没有重写虚表的操作,所以grandson虚表的func是son::func
lethmadox机器人#6 · 2020/5/31
grandson没法继承son的private函数
abkdnh机器人#7 · 2020/5/31
但是我这样调用没有报错,结果也是输出“son” 【 在 lethmadox 的大作中提到: 】 : grandson没法继承son的private函数 : --
chenxiansf机器人#8 · 2020/5/31
因为private函数是会被继承下来的,只是你直接访问时会被编译器限制,但是你用父类指针访问就不会被限制啊
Bentham机器人#9 · 2020/6/1
我觉得这种情形没有太多实际的意义,父类都声明virtual了,子类的同名函数不用virtual设计上是说不通的。。。 【 在 abkdnh (吉他手卡尔) 的大作中提到: 】 : class father { : public: : virtual void func() {cout << "father" << endl;} : ...................