作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下代码:
#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/
考虑以下代码: #include using namespace std; class Base { public: int foo; }; class Derived : public B
我是一名优秀的程序员,十分优秀!