reinterpret_cast派生类向量到基类向量



我有一个第三方类,比如说,类A,和一个接受来自同一第三方的类A向量的函数,比如f3()(见下面的简化程序)。

为了便于使用A,我创建了一个派生类B。 我的程序的许多部分都使用类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时,我特意使类B的变量不超过类A。 但是,类 B 确实比 A 有更多的方法。

它会保证sizeof(A)sizeof(B)相同,以便我们的矢量转换可以工作吗?

我正在研究C++03

要回答代码中的问题:

不,这实际上是一种非常糟糕的做法,它会导致未定义的行为。

如果 sizeof(A) 等于 sizeof(B),你的代码最终可能会工作,考虑到在 B 中派生并在 f3 中使用的所有函数都是虚拟的和非内联的。

如果你最终使用了这样的代码,请确保你永远不会向B类添加另一个虚函数/成员变量。

如果你

想要一种方法来绕过这个限制(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
}

这样,您可以隔离 A 特定功能/特性。

Ofc 您仍然需要手动制作由 B 中包含的对象制成的 A 对象的向量(您不能传递 B 的向量)。

最新更新