gpt4 book ai didi

C++ 模板和以基类和子类作为模板参数的转换

转载 作者:行者123 更新时间:2023-11-28 05:31:33 24 4
gpt4 key购买 nike

抱歉,标题令人困惑。我不确定如何更好地描述我的问题。

请看下面的代码:

template<class T>
class TmpClass
{};

class Base
{};

class Child : public Base
{};

int main()
{
typedef TmpClass<Base*> A;
typedef TmpClass<Child*> B;

A a;
B b;
A* ap = &b; //this does not work
}

为什么虽然派生了模板参数,但强制转换不起作用?

最佳答案

因为它生成了 2 个不同的类。让我们假设以下情况:

template<class T>
struct TmpClass
{
T t;
double d;
};

struct Base
{
int i;
};

struct Child : public Base
{
int i2;
};

这真的很基本,甚至会因虚函数等而变得更加困惑。这只是针对可能发生的问题进行了简化。

当你现在实例化类时,它们看起来像这样(他的名字完全由我组成)

struct _internal_TmpClass_Base
{
Base t;
double d;
};

struct _internal_TmpClass_Child
{
Child t;
double d;
};

事情是:

Base 的大小是sizeof(int) . Child的大小是2*sizeof(int)

如果你想访问d在 TmpClass 中,它(取决于模板)位于完全不同的内存位置。 TmpClass<Child>dChild 大小之后的位置(2*整数)。当您现在将其转换为 TmpClass<Base>你想访问 d它假定这是在 Base 大小之后的内存中(1*int) 不是 Child .你会读取或写入你不想要的内存。

那些东西通常被归类为“未定义的行为”

关于C++ 模板和以基类和子类作为模板参数的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39387180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com