gpt4 book ai didi

c++ - 将派生类的 vector 重新解释为基类的 vector

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:58 24 4
gpt4 key购买 nike

我有一个第 3 方类,例如 A 类,以及一个接受来自同一个第 3 方的 A 类 vector 的函数,例如 f3 ()(请参阅下面的简化程序)。

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

问题是,如何调用 f3() 并将 B 的 vector 作为参数?在 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 继承自 一个。但是,类 B 确实比 A 有更多的方法。

它能否保证 sizeof(A)sizeof(B) 相同,以便我们的 vector 转换有效?

我正在研究 C++03

最佳答案

根据您的代码回答问题:

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

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

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

如果您想绕过此限制(f3 第三方函数只接受 A 的 vector ),请尝试使 B 成为复合而不是派生(如果您不访问 A 的 protected 成员):

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 对象的 vector (您不能传递 B 的 vector )。

关于c++ - 将派生类的 vector 重新解释为基类的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30843930/

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