gpt4 book ai didi

c++ - 从基类继承私有(private)成员

转载 作者:搜寻专家 更新时间:2023-10-31 00:16:48 26 4
gpt4 key购买 nike

这个问题已经有人问过here -- 实际上不止两次 -- 但我自己无法从这些帖子中得出解决我的问题的方法。

我有一个库,其中有一个名为 A 的类在里面。来自类(class)A我需要访问 std::map<> , 但它是私有(private)的。此外,根据我在我提到的帖子中发现的可能性,class A没有模板化功能。

我实际上能够重新编译库,这样我就可以简单地更改可见性。 但是,这将是很多的工作——而且我不确定更改可见性是否不会导致其他任何东西崩溃。

我想做的是,在类里面 B :

// NOT MY CODE -- library <a.h>
class A {
private:
std::map<int, int> A_map;
};

// MY CODE -- module "b.h"
# include <a.h>
class B : private A {
public:
B() {
for (auto it(A_map.begin()); it != A_map.end(); ++it) {
...;
}
}
};

在不更改原始类并且基类中没有任何可用的模板化方法进行重载/特化的情况下,我该如何做到这一点?

最佳答案

您首先应该非常确信您尝试做的事情实际上是有效的……变量是私有(private)的可能有一个很好的理由。修改它可能会破坏 A 实例的状态,并且当您破坏封装以读取它时,不能保证私有(private)变量将处于逻辑或一致状态。

需要注意的是,如果您可以修改/重新编译库,声明您的类是 A 的友元,则可能是可行的方法。让 B 通过组合持有 A 的一个实例,因为它是 friend ,所以它可以访问 A 实例的私有(private)成员。


而且,因为我感觉特别邪恶,所以这里有一个演示如何在不修改 A 的情况下打破封装。虽然它不可移植(我在 64 位 Linux 上使用 g++ 工作)并且涉及计算内存中的对象布局。为简单起见,我将 map 更改为 vector 。

#include<vector>
#include<iostream>

class A {
private:
int blah; //Just to make it a bit more realistic.
std::vector<int> A_vec;
public:
void outputVec() {
std::vector<int>::iterator it = A_vec.begin();
while(it != A_vec.end()) {
std::cout << *it << std::endl;
++it;
}
}
};


int main() {
A* a = new A();
std::vector<int>* v = (std::vector<int>*)(((char*)a)+sizeof(long));
v->push_back(27);
v->push_back(12);
a->outputVec();
return 0;
}

关于c++ - 从基类继承私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15100515/

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