返回信息流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类的实现呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #100030同步于 2020/5/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于override的一个小疑问
abkdnh
2020/5/30镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这里grandson没有override,而且son里的还是私有的,我还以为肯定会报错呢
【 在 q627785091 的大作中提到: 】
: 前人栽树后人乘凉
: --
好像说了句废话,具体是 father的虚表func是 father::func,son先拷贝father的虚表,将son声明的函数实体替换掉虚表对应位置的虚函数,son虚表里的func就是
son::func,grandson从son拷贝虚表,没有重写虚表的操作,所以grandson虚表的func是son::func
【 在 h3m (h3m) 的大作中提到: 】
: 因为grandson的虚表里的func函数是son::func
谢谢,懂了
【 在 h3m 的大作中提到: 】
: 好像说了句废话,具体是 father的虚表func是 father::func,son先拷贝father的虚表,将son声明的函数实体替换掉虚表对应位置的虚函数,son虚表里的func就是
: son::func,grandson从son拷贝虚表,没有重写虚表的操作,所以grandson虚表的func是son::func
但是我这样调用没有报错,结果也是输出“son”
【 在 lethmadox 的大作中提到: 】
: grandson没法继承son的private函数
: --
我觉得这种情形没有太多实际的意义,父类都声明virtual了,子类的同名函数不用virtual设计上是说不通的。。。
【 在 abkdnh (吉他手卡尔) 的大作中提到: 】
: class father {
: public:
: virtual void func() {cout << "father" << endl;}
: ...................