A类:公共虚拟B和A类:公共B有什么区别
What is difference between class A:public virtual B and class A:public B
#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;
}
我知道虚拟解决了这个问题,但如何解决呢?为了安全起见,我们可以一直编写公共虚拟吗?即使我们没有多重继承。
derive
的每个实例都有一个middle1
基类子对象和一个middle2
基类子对象。
如果继承是非虚拟的,则middle1
基类子对象具有base
基类子对象,和middle2
基类子对象也具有base
基类子对象。因此,derive
的每个实例都有两个base
子对象,而调用pd->f()
是不明确的——您想在base
对象中的哪个对象上调用f()
?
使继承虚拟化意味着middle1
和middle2
将共享derive
的单个base
子对象。这消除了歧义——只有一个base
对象可以调用f()
我们可以一直写公共虚拟安全吗
不一定。在继承层次结构中,您可能不希望middle1
和middle2
共享公共base
子对象。你可能会争辩说,在这种情况下,你不应该编写一个从两者继承的类derive
,但如果你最终遇到了这种情况,那么解决方法是:
static_cast<middle1*>(pd)->f();
pd->middle1::f();
指定要在middle1
基类子对象或上调用f
static_cast<middle2*>(pd)->f();
pd->middle2::f();
以指定CCD_ 25。
虚拟基类实现了一个额外的间接级别,以解决钻石问题(请参阅此问题(。
如果您始终使用虚拟继承,那么您将始终承受由该附加间接级别所导致的性能损失。
因此,我建议您只在必要时使用虚拟继承。
我知道虚拟解决了这个问题,但如何解决呢
virtual
关键字通过使继承层次结构中只存在一个顶级基类子对象来解决这个问题。没有它,每个父类CCD_;CCD_ 28具有它们自己的CCD_。
即使我们没有多重继承,为了安全,我们是否可以一直编写公共虚拟
如果没有多重继承,就没有理由使用virtual
继承。多重继承是虚拟继承概念存在的目的。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- c++库的公共头文件中应该包含什么
- 将公共但非静态的成员函数与ALGLIB集成
- C++从另一个类访问公共静态向量的正确方法是什么
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 如何找到2个单链表的公共节点
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 将地址分配给本地指针后,公共对象的变量将消失
- 有没有办法声明一个公共静态常量,该常量将使用 constexpr 在源文件中定义(有什么区别)?
- 与公共,私人和受保护的区别
- 具有公共成员而没有构造函数的结构和类之间的编译器是否有区别
- 基类中的私有成员和公共成员有什么区别
- 公共静态类成员函数和在命名空间中声明的全局函数有什么区别?
- 私有访问修饰符和公共访问修饰符在性能上有区别吗?
- 公共成员和公共继承的受保护成员有什么区别?
- A类:公共虚拟B和A类:公共B有什么区别
- C++中的友元声明-公共和私有之间的区别