虚拟继承:如果关键字在某个时候被遗忘,会发生什么
Virtual Inheritance: what happens if the keyword is at some point forgotten?
如果在一大串继承中,virtual
关键字在某个时候被遗忘了,会发生什么?
例如:
struct I {};
struct A : virtual I {};
struct B : A, virtual I {};
struct C : B, /* virtual */ I {}; // ooops, distraction error
就像在方法案例中一样,一旦方法成为虚拟的,它就会永远保持虚拟,还是struct C
重新引入钻石问题?
有没有办法让编译器检查这种类型的错误,就像新的 override
关键字检查虚拟方法的正确覆盖一样?
这里发生的情况如下:
-
A
作为其内存的一部分I
-
B
作为其内存的一部分得到完全A
- C 得到恰好
B
加上一个额外的I
作为其内存的一部分
所以它不是钻石,而更像是断叉:
I
|
A
|
B I
/
C
此外,严格来说,这不是一个错误——至少不是编译错误——而是语言的一个特性。
至于避免它,你可能应该把你的虚拟继承工作限制在你真正专注的时候,和/或尽可能避免它。
如果在大型继承链中,虚拟关键字会发生什么 在某个时候被遗忘了吗?
struct A : virtual I {};
struct B : A, virtual I {};
你为什么要"重新引入"I
?它已经是一个虚拟基类。你只是多余。
没有理由这样做。唯一可能的原因是放宽访问控制(或访问私有虚拟基类),并且基类在这里已经是公共的。
所以这个问题毫无意义。当您从不重复基类名称时,您不会忘记继承链中的第二个virtual
。
相关文章:
- 无论我使用什么,我的输入都会被跳过
- 叮叮当当:什么可能导致NOLINT评论不被尊重?
- C++异常被捕获延迟,可能导致这种情况的原因是什么?
- 我的C++级数计算程序出了什么问题?被困了好几个星期
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 如果链表被重新分配,会发生什么
- 堆指针不会被分配给数组有什么原因吗
- 是什么能让dynamic_cast开始抛出 std:bad_cast 即使被调用在指针上?
- 如果消息被 TCP 分段,接收方会做什么
- 属于副本被推送到矢量的对象的指针会发生什么情况?
- 当 reset() 被unique_ptr调用两次时会发生什么?
- 在C++中将结构从被调用函数返回到调用函数的适当方法是什么
- 当删除或删除[]被执行时,计算机会做什么?
- C 编译器 - 被遗忘的返回语句
- 虚拟继承:如果关键字在某个时候被遗忘,会发生什么
- 如何修复这个被遗忘的服务器编译错误
- 这个C++14构造被称为什么,它似乎链接了lambdas
- 当指针指向动态分配的内存时,指针指向指针的指针被赋什么值?
- 设计模式——在c++中,当实现(一组单例)直接从它们的编译单元在某个注册表中自注册时,它被称为什么?