gpt4 book ai didi

c++ - 衍生**到基础**

转载 作者:行者123 更新时间:2023-11-27 23:59:57 25 4
gpt4 key购买 nike

考虑以下代码:

#include <iostream>

using namespace std;

class Base
{
public:
int foo;
};

class Derived : public Base
{
public:
float bar;
};

int main()
{
Base** baseArr = new Base*[30];

for (int i=0; i<30; i++)
{
Derived* derived = new Derived();
derived->foo = i;
derived->bar = i * 2.5;
baseArr[i] = derived;
}

//Notice this!
Derived** derivedArr = (Derived**)(baseArr);

for (int i=0; i<30; i++)
cout << "My Base " << i << ": " << derivedArr[i]->foo << ", " << derivedArr[i]->bar << endl;

return 0;
}

数组到数组的转换是否安全?指针大小在整个程序中是相同的,所以听起来我不会得到任何填充错误。但是,我知道执行此操作的正确方法是遍历每个元素并单独转换它。

但是,我试图通过使用非通用私有(private)函数返回数组,利用这种转换将我的模板公共(public)函数实现移动到 .cpp 文件,因此我可以确定我的 Base 数组将仅包含特定的 Derived 指针。

private:
Base** Find(function<bool(Base*)> Predicate, int& N); //Implemented in .CPP

public:
template <class T> T** FindByType(int &N) //T is derived from Base
{
//Safe?
return (T**)(Find(
[](Base* b)->bool { return typeid(T) == typeid(b); },
N));
};

当然,这只是一个简化的例子。在这种情况下,我有很多理由使用 RTTI。 N用于控制数组大小。

我想知道这个不安全的转换是否会因多重继承而失败,例如 Derived 类也会继承 OtherBase 并且我想转换为 OtherBase**,我还想知道如果我决定使用这个构造,我是否有机会遇到未定义的行为,或者我可能遇到的任何潜在问题。

最佳答案

不,这不安全。

指向Derived 的指针与指向Base 的指针不同。指向 Derived 的指针可以转换为指向 Base 的指针,但最终结果是一个不同的指针。

因为指向 Derived 的指针与指向 Base 的指针不同,所以指向 Derived 的指针也是与指向 Base 的指针不同。

关于c++ - 衍生**到基础**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917529/

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