reinterpret_cast 派生向量 class 到基础向量 class
reinterpret_cast vector of derived class to vector of base class
我有一个第 3 方 class,比如说 class A
,以及一个接受来自同一个第 3 方的 class A
向量的函数-派对,说 f3()
(请参阅下面的简化程序)。
为了更方便地使用A
,我创建了一个派生的classB
。我程序的很多部分使用了 class B
.
问题是,我怎样才能用 B
的向量作为参数调用 f3()
?
在 f3()
的参数中强制转换是否像下面的程序一样是一种好的做法?
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
// a 3rd-party class
class A
{
public:
int n;
void f1();
};
// my class
class B: public A
{
public:
void f2();
};
// a 3rd-party function
void f3(std::vector<A> &a);
int main()
{
std::vector<B> y;
y.push_back(B());
y.push_back(B());
y.push_back(B());
y.push_back(B());
f3(*(vector<A>*)(&y)); // Is this a good practice?
cout << y[3].n << endl;
return 0;
}
请注意,为了兼容性,当 B
继承自 A
。然而,Class B
确实比 A
有更多的方法。
它能保证 sizeof(A)
与 sizeof(B)
相同,从而使我们的 vector 转换有效吗?
我正在研究 C++03
根据您的代码回答问题:
不,这实际上是一种非常糟糕的做法,它会导致未定义的行为。
如果 sizeof(A) 等于 sizeof(B),考虑到在 B 中派生并在 f3 中使用的所有函数都是虚拟的和非内联的,您的代码可能最终会起作用。
如果您最终使用这样的代码,请确保您永远不会向 B 添加另一个虚函数/成员变量 class。
如果您想绕过此限制(f3 第三方函数仅接受 A 的向量),请尝试将 B 设为复合而不是派生(如果您不访问 A 的受保护成员):
class A
{
public:
int n;
void f1();
}
class B
{
public:
B (const A& a); // dependency injection
void f2();
A myA; // bad practice, should be private with getter /setter
}
这样你就可以隔离特定的功能/特性。
当然,您仍然需要手动创建一个由 B 中包含的对象组成的 A 对象的向量(您不能传递 B 的向量)。
我有一个第 3 方 class,比如说 class A
,以及一个接受来自同一个第 3 方的 class A
向量的函数-派对,说 f3()
(请参阅下面的简化程序)。
为了更方便地使用A
,我创建了一个派生的classB
。我程序的很多部分使用了 class B
.
问题是,我怎样才能用 B
的向量作为参数调用 f3()
?
在 f3()
的参数中强制转换是否像下面的程序一样是一种好的做法?
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
// a 3rd-party class
class A
{
public:
int n;
void f1();
};
// my class
class B: public A
{
public:
void f2();
};
// a 3rd-party function
void f3(std::vector<A> &a);
int main()
{
std::vector<B> y;
y.push_back(B());
y.push_back(B());
y.push_back(B());
y.push_back(B());
f3(*(vector<A>*)(&y)); // Is this a good practice?
cout << y[3].n << endl;
return 0;
}
请注意,为了兼容性,当 B
继承自 A
。然而,Class B
确实比 A
有更多的方法。
它能保证 sizeof(A)
与 sizeof(B)
相同,从而使我们的 vector 转换有效吗?
我正在研究 C++03
根据您的代码回答问题:
不,这实际上是一种非常糟糕的做法,它会导致未定义的行为。
如果 sizeof(A) 等于 sizeof(B),考虑到在 B 中派生并在 f3 中使用的所有函数都是虚拟的和非内联的,您的代码可能最终会起作用。
如果您最终使用这样的代码,请确保您永远不会向 B 添加另一个虚函数/成员变量 class。
如果您想绕过此限制(f3 第三方函数仅接受 A 的向量),请尝试将 B 设为复合而不是派生(如果您不访问 A 的受保护成员):
class A
{
public:
int n;
void f1();
}
class B
{
public:
B (const A& a); // dependency injection
void f2();
A myA; // bad practice, should be private with getter /setter
}
这样你就可以隔离特定的功能/特性。
当然,您仍然需要手动创建一个由 B 中包含的对象组成的 A 对象的向量(您不能传递 B 的向量)。