如何解决如果自己的基类为空,用于访问另一个基类成员的 static_cast 将返回错误
我有一个包含多个(虚拟)基础的结构。从这些基类的构造函数之一我 static_cast 到派生程度最高的类型,然后尝试访问另一个基类的成员(之前已初始化)。直接从派生最多的结构的构造函数访问时,地址与结果不匹配。奇怪的是(至少对我而言)只有在另一个基(static_cast 起源的结构的直接基)为空时才会出现问题。
我在下面的例子中重现了这个问题(在 ubuntu linux 上用 GNU 9.3.0 测试)
#include <iostream>
#include <string>
/* --: virtual inheritance
* ==: non-virtual inheritance
* BB
* / \
* LB RB
* | \ / |
* | B |
* LD || RD
* \\ || //
* D
*/
struct BaseBase
{
BaseBase() { std::cout << "BaseBase" << std::endl; }
int iBB=1;
};
struct LeftBase : public virtual BaseBase
{
LeftBase() { std::cout << "LeftBase" << std::endl; }
int iLB=2;
};
struct RightBase : public virtual BaseBase
{
RightBase() { std::cout << "RightBase" << std::endl; }
//int iRB=3; //--> uncomment here to resolve? problem
};
struct Base : public virtual LeftBase,public virtual RightBase
{
Base() { std::cout << "Base" << std::endl; }
int iB=4;
};
struct LeftDerived : public virtual LeftBase
{
LeftDerived() { std::cout << "LeftDerived " << std::endl; }
int iLD=5;
};
template<typename DerivedType>
struct RightDerived : public virtual RightBase
{
RightDerived() { std::cout << "RightDerived " << &( static_cast<DerivedType*>(this)->iLB ) /*<< " " << static_cast<DerivedType*>(this)->iLB*/ << std::endl; }
int iRD=6;
};
struct Derived : public Base,public LeftDerived,public RightDerived<Derived>
{
Derived() { std::cout << "Derived " << &(iLB) << std::endl; }
int iD=7;
};
int main()
{
Derived MyDerived;
}
我得到以下输出(从所有构造函数打印以显示基类初始化的顺序):
BaseBase
LeftBase
RightBase
Base
LeftDerived
RightDerived 0xd5957b646068
Derived 0x7ffd19379408
如果我取消注释'RightBase'中的int,我会得到:
BaseBase
LeftBase
RightBase
Base
LeftDerived
RightDerived 0x7ffebf1fb948
Derived 0x7ffebf1fb948
除了找到解决方案(基本非空是一种解决方案)之外,我还想了解为什么上面的代码是错误的,以及在哪种情况下我可能会遇到类似的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。