reinterpret_cast派生类的向量到基类

时间:2015-06-15 11:24:04

标签: c++ vector c++03

我有一个第三方课程,比如,课程A,以及一个接受来自同一第三方的课程A的向量的函数,比如f3()(请参阅下面的简化程序)。

为了更方便地使用A,我创建了一个派生类B。我的程序的很多部分都使用了类B

问题是,如何使用f3()向量作为参数调用B? 在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

1 个答案:

答案 0 :(得分:2)

要回答代码中的问题:

不,它实际上是一种非常糟糕的做法,它会导致不明确的行为。

如果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
}

这样您就可以隔离特定的功能/特性。

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