作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
#include<iostream>
using namespace std;
class base
{
public:
virtual void f(){}
};
class middle1:public base
{};
class middle2:public base
{};
class derive:public middle1,public middle2
{};
int main()
{
derive* pd=new derive();
pd->f();
return 0;
}
我知道 virtual 可以解决这个问题,但是怎么做呢?即使我们没有多重继承,我们也能始终为了安全而编写 public virtual 吗?
最佳答案
derive
的每个实例有一个 middle1
基类子对象和一个 middle2
基类子对象。
如果继承是非虚拟的,那么 middle1
基类子对象有一个 base
基类子对象,和 middle2
基类子对象也有一个 base
基类子对象。因此,derive
的每个实例有两个base
子对象和调用 pd->f()
是模棱两可的 - base
中的哪一个你想给对象打电话f()
上?
使继承成为虚拟意味着 middle1
和 middle2
将共享一个base
derive
的子对象.这消除了歧义——只有一个 base
f()
的对象可以调用。
Can we always write public virtual for safety
不一定。可能存在您不想要的继承层次结构middle1
和 middle2
分享一个公众base
子对象。您可能会争辩说,在这种情况下,您不应该编写一个类 derive
从两者继承,但如果你最终遇到这种情况,那么解决方法是:
static_cast<middle1*>(pd)->f();
pd->middle1::f();
指定您要调用f
在 middle1
上基类子对象,或者
static_cast<middle2*>(pd)->f();
pd->middle2::f();
指定middle2
.
关于c++ - A类:public virtual B and class A:public B有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15498364/
我是一名优秀的程序员,十分优秀!