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