gpt4 book ai didi

c++ - 如何将 "hide"虚方法? (C++)

转载 作者:行者123 更新时间:2023-11-28 06:36:08 25 4
gpt4 key购买 nike

有一篇标题非常相似的帖子here ,但据我了解,实际问题有所不同。

我想知道是否可以强制我编写的类的用户覆盖某个方法,但同时应该不可能调用此方法(但它只能从我的类中调用) .

例如,如果我想执行以下操作:

class AbstrDataSource {
private:
int index;
protected:
int currentData;
public:
int getData(){return currentData;}
void loadData(int i){
// check valid index here
if (index != i){doLoad(i);}
this->index = i;
}
virtual void doLoad(int i)=0;
};

在 loadData() 中,我可以检查索引是否在有效范围内并进行一些簿记,而实际加载必须由用户通过覆盖 doLoad() 来提供。因为纯虚方法是接口(interface)的一部分,所以它们是公共(public)的,但是我如何强制 doLoad() 的实现只对我自己的类可见?

我的想法是将对象隐藏在一些包装器中:

class DataSupplier {
public:
DataSupplier(AbstrDataSource* s) : source(s){}
void loadData(int i){source->loadData(i);}
int getData(){return source->getData();}
private:
AbstrDataSource* source;
};

我没有使用抽象类,而是使用了包装器:

int SomeCalculation(DataSupplier* a,DataSupplier* b){
return a->getData() + b->getData();
}

然而,这并没有真正的帮助。假设第二个人提供了我的抽象类的实现:

class ImplDataSource : public AbstrDataSource{
public:
void doLoad(int i){this->currentData = i;}
};

然后第三个人仍然可以访问 doLoad():

void main(){
AbstrDataSource* ads = new ImplDataSource();
DataSupplier* ds1 = new DataSupplier(ads);
DataSupplier* ds2 = new DataSupplier(ads);
ads->doLoad(10); // <- How to avoid this ??
ds1->loadData(12);
ds2->loadData(12);
SomeCalculations(ds1,ds2);
}

也许有一种方法可以通过使用访问说明符...?

编辑:我已经得到了一些有用的答案,但我认为我没有足够清楚地陈述我的问题。只要 ImplDataSource 将 doLoad() 声明为 protected 或私有(private)的,一切都很好。然而,只看 AbstrDataSource,没有暗示 doLoad() 的任何实现都应该是私有(private)的(即使抽象 doLoad 是 protected 或私有(private)的,实际实现可以有任何访问权限)。我想知道是否有可能以某种方式“强制”抽象 doLoad() 的任何实现都是私有(private)的。也许我只是想得太复杂了,最简单的方法是在抽象方法的文档中添加注释(“作为私有(private)实现,否则它可能会失败”)。

最佳答案

您要实现的目标称为模板方法模式,并且我认为你在这里能做的最好的事情是将不太“敏感”的行为委托(delegate)给 doLoad 方法,并将 loadData(以及你想从派生类中隐藏的部分)置于私有(private)访问中

关于c++ - 如何将 "hide"虚方法? (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733422/

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