hil*_*sia 5 c++ inheritance containers
我有一些基本的继承树:
class Base {
virtual double func() = 0;
// functionality is not important for the problem
// but it's good to know that Base has some virtual functions
};
class DerivedA : public Base {
virtual double func() {}; // implementation A
};
class DerivedB : public Base {
virtual double func() {}; // implementation B
};
Run Code Online (Sandbox Code Playgroud)
我有一个容器,指向一个DerivedA或多个DerivedB实例的指针.
void f1(std::vector<Base*> a) () { /* some code */ }
int main(in, char**) {
std::vector<Base*> base_container;
f1(base_container); // works fine
}
Run Code Online (Sandbox Code Playgroud)
几乎所有东西都在Base上工作,但是我有一些函数,没有在DerivedA或中指定DerivedB,是特定于实现的,但是在一个DerivedA或DerivedB容器上工作.我们假设以下代码片段:
void f2(std::vector<DerivedA*> a) () { /* implementation A specific code */ }
void f2(std::vector<DerivedB*> a) () { /* implementation B specific code */ }
Run Code Online (Sandbox Code Playgroud)
调用正确函数的最佳做法是什么?我列出了一些可能的解决方案,我想到了这些解决方案,但它们都有很大的缺点.
我可以在实现特定的容器中保存所有数据.但是,f1()由于std::vector<DerivedA*>不是孩子std::vector<Base*>(因为有充分理由!),因此不再适用.
我可以一直手动转换所有对象,但这很难看.
我可以手动调用正确的函数,通过给它们提供与众不同的名称(例如f2_a和f2_b)来获得Base容器,但这看起来很难看.
我可以将f2实现为函数模板特化,但这似乎是滥用.
我可以尝试使容器上的函数仅依赖于容器中对象的函数,然后为它们实现重载函数.这是在一些情况下一个很好的解决方案,但对我来说这真的是一个函数在容器上,容器上给予不同的实现为DerivedA和DerivedB,不只是遍历容器的内容.
你会如何实现这样的事情?我怎样才能得到一个容器,它能够被传递到两个f1()及f2()?
最好的解决方案是让您的继承代表替换,并让基类具有完成所有工作的完整接口,使用虚拟方法来选择要使用的派生类方法。然后f2只需要一个基指针向量。
否则,如果您需要访问的派生类中确实存在特定不同的接口(如果有,请花点时间考虑一下您的设计做了什么),那么您最好的方法是使用不同命名的方法,每个派生类都有一个不同的名称类型,每个类型都接受一个基指针向量。通过适当命名的方法,用户将清楚需要哪种类型。
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |