STL*_*mer 2 c++ virtual multiple-inheritance
#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;
}
Run Code Online (Sandbox Code Playgroud)
我知道 virtual 解决了这个问题,但如何解决?即使我们没有多重继承,我们是否可以始终编写公共虚拟以确保安全。
每个实例derive都有一个middle1基类子对象和一个middle2基类子对象。
如果继承非虚拟的,则middle1基类子对象具有base基类子对象,和所述middle2基类的子对象也有一个base基类的子对象。因此, 的每个实例derive都有两个base子对象,并且调用pd->f()是不明确的——base您要调用哪个对象f()?
使该继承虚拟装置middle1和middle2将共享单个base的子对象derive。这消除了歧义——只有一个base对象f()可以被调用。
为了安全,我们可以总是写公共虚拟吗
不必要。有可能是在你不继承层次想 middle1和middle2共享一个公共base的子对象。您可能会争辩说,在这种情况下,您不应该编写一个derive继承自两者的类,但如果您最终遇到这种情况,那么解决方法是:
static_cast<middle1*>(pd)->f();
pd->middle1::f();
Run Code Online (Sandbox Code Playgroud)
指定要调用f的上middle1基类的子对象,或
static_cast<middle2*>(pd)->f();
pd->middle2::f();
Run Code Online (Sandbox Code Playgroud)
来指定middle2。
| 归档时间: |
|
| 查看次数: |
2361 次 |
| 最近记录: |