gpt4 book ai didi

c++ - 向上转换一个 const vector

转载 作者:行者123 更新时间:2023-11-30 01:18:47 25 4
gpt4 key购买 nike

说我有

class Parent
{};

class ChildOne : Parent
{};

class ChildTwo : Parent
{};

void SomeMethod(std::vector<Parent*>& parents);

我明白为什么我不能通过 std::vector<ChildOne*>作为 SomeMethod 的参数因为有可能 SomeMethod可能是:

void SomeMethod(std::vector<Parent*>& parents)
{
parents.push_back(new ChildTwo);
}

这将是无效的。

但为什么我不能传递 std::vector<ChildOne*>作为

的参数
void AnotherMethod(const std::vector<Parent*>& parents);

在这种情况下,我想不出哪里出了问题,但我一定遗漏了什么。

编辑:

澄清一下,我想知道为什么存在这个限制。在 C# 中(例如),这将编译(使用 IEnumerables)。我假设存在一个失败案例。

最佳答案

你是对的,它在这种特殊情况下在大多数常见平台上都可以工作。但是,如果允许这种情况普遍存在,那将是一个可怕的蠕虫病毒。

考虑到该标准不能保证所有数据指针的大小相同(例如,有些平台的 char* 大于 int* ,因为它们没有单独可寻址的字节)。您可以将派生指针转换为基址指针的事实并不意味着这种转换是微不足道的并且不会影响内存中的表示。毕竟,一旦出现多重继承,即使这种转换也开始涉及更改指针的值。

与此同时,模板通常是相当不透明的。我们知道 std::vector<T*> 的合理实现将为所有 T 的数据使用相同的布局s,只要T*尺寸相同。但一般来说,模板可以根据其模板参数做任何事情,数据布局完全不兼容。

更不用说专门化了——如果模板专门用于 <ChildOne*> , 它可能完全不兼容。

是的,在某些情况下,对用 Parent* 实例化的模板的特定实现 的常量引用可以别名为用 ChildOne* 实例化的同一模板.但这些非常脆弱,在一般情况下,这种可替代性会导致无数错误。


如果您知道在您的平台上通过您的标准库实现和您的类型是安全的,您可以为它创建一个转换函数:

template <class D, class S>
const std::vector<D*>& base_cast(const std::vector<S*> &src)
{
return reinterpret_cast<const std::vector<D*>&>(src);
}

但使用风险自负。

关于c++ - 向上转换一个 const vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22141334/

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