Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?_C++_Inheritance - Fatal编程技术网

C++ 当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?

C++ 当涉及部分虚拟继承时,这是计算创建的基类对象数量的正确方法吗?,c++,inheritance,C++,Inheritance,从我对虚拟继承的了解来看,每当我们有一个类a(基类),类B、C、D(这三个类实际上都继承类a),那么如果有一个类派生自类B,C和D类实例化后,将只创建类a的单个对象 我试图通过不同的案例来解释虚拟继承: 案例1: 0x7ffc8adac1c0 0x7ffc8adac1c0 0x7ffd512429c8 0x7ffd512429c8 0x7ffd512429bc 假设派生的类仅从类B和类C继承。即使这样,只有一个类a的对象被实例化,对吗 我试图用这段代码来验证这一点,但情况确实如此: #i

从我对虚拟继承的了解来看,每当我们有一个类a(基类),类B、C、D(这三个类实际上都继承类a),那么如果有一个类派生自类BCD类实例化后,将只创建类a的单个对象

我试图通过不同的案例来解释虚拟继承:

案例1:

0x7ffc8adac1c0
0x7ffc8adac1c0

0x7ffd512429c8
0x7ffd512429c8
0x7ffd512429bc

假设派生的类仅从类B类C继承。即使这样,只有一个类a的对象被实例化,对吗

我试图用这段代码来验证这一点,但情况确实如此:

#include <iostream>
using namespace std;
class A
{
    public:
    int a;
};
class B: virtual public A
{
  public:
  int b;
};
class C: virtual public A
{
    public:
    int c;
};
class D: virtual public A
{
    public:
    int d;
};
class derived: public B, public C
{
    public:
    int y;
};
int main() 
{
    derived dObj;
    cout<<&(dObj.B::a)<<'\n';
    cout<<&(dObj.C::a)<<'\n';
    return 0;
}
#include <iostream>
using namespace std;
class A
{
    public:
    int a;
};
class B: virtual public A
{
  public:
  int b;
};
class C: virtual public A
{
    public:
    int c;
};
class D: public A
{
    public:
    int d;
};
class derived: public B, public C, public D
{
    public:
    int y;
};
int main() 
{
    derived dObj;
    cout<<&(dObj.B::a)<<'\n';
    cout<<&(dObj.C::a)<<'\n';
    cout<<&(dObj.D::a)<<'\n';
    return 0;
}
案例2:

0x7ffc8adac1c0
0x7ffc8adac1c0

0x7ffd512429c8
0x7ffd512429c8
0x7ffd512429bc

假设派生的类继承自类BCD,但类D实际上不继承类A。在本例中,类A的两个对象被实例化,对吗一个用于BC和一个用于D

我试图用这段代码来验证这一点,但情况确实如此:

#include <iostream>
using namespace std;
class A
{
    public:
    int a;
};
class B: virtual public A
{
  public:
  int b;
};
class C: virtual public A
{
    public:
    int c;
};
class D: virtual public A
{
    public:
    int d;
};
class derived: public B, public C
{
    public:
    int y;
};
int main() 
{
    derived dObj;
    cout<<&(dObj.B::a)<<'\n';
    cout<<&(dObj.C::a)<<'\n';
    return 0;
}
#include <iostream>
using namespace std;
class A
{
    public:
    int a;
};
class B: virtual public A
{
  public:
  int b;
};
class C: virtual public A
{
    public:
    int c;
};
class D: public A
{
    public:
    int d;
};
class derived: public B, public C, public D
{
    public:
    int y;
};
int main() 
{
    derived dObj;
    cout<<&(dObj.B::a)<<'\n';
    cout<<&(dObj.C::a)<<'\n';
    cout<<&(dObj.D::a)<<'\n';
    return 0;
}
现在我的问题是:


我的观察正确吗?也就是说,让我们假设我们有n类继承类A,如果从中继承m(1来自cppreference网站中的内容,那么情况确实如此:

#include <iostream>
using namespace std;
class A
{
    public:
    int a;
};
class B: virtual public A
{
  public:
  int b;
};
class C: virtual public A
{
    public:
    int c;
};
class D: virtual public A
{
    public:
    int d;
};
class derived: public B, public C
{
    public:
    int y;
};
int main() 
{
    derived dObj;
    cout<<&(dObj.B::a)<<'\n';
    cout<<&(dObj.C::a)<<'\n';
    return 0;
}
#include <iostream>
using namespace std;
class A
{
    public:
    int a;
};
class B: virtual public A
{
  public:
  int b;
};
class C: virtual public A
{
    public:
    int c;
};
class D: public A
{
    public:
    int d;
};
class derived: public B, public C, public D
{
    public:
    int y;
};
int main() 
{
    derived dObj;
    cout<<&(dObj.B::a)<<'\n';
    cout<<&(dObj.C::a)<<'\n';
    cout<<&(dObj.D::a)<<'\n';
    return 0;
}