gpt4 book ai didi

C++ 模板和继承

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:59 26 4
gpt4 key购买 nike

我的 C++ 框架有按钮。 Button 派生自 Control。因此接受 Control 的函数可以将 Button 作为其参数。到目前为止一切顺利。

我还有列表<吨>。但是,列表 < Button> 不是从列表派生的 < Control>,这意味着接受控件列表的函数不能将按钮列表作为其参数。这很不幸。

也许这是个愚蠢的问题,但我不知道该如何解决 :( List < Button > 应该派生自 List < Control > ,但我没有看到使这种情况“自动”发生的方法。

最佳答案

Stroustrup 在他的常见问题解答中有一个关于此的项目:

Why can't I assign a vector<Apple*> to a vector<Fruit*>

可以通过两种方式解决:

  • 使列表包含指向Control的指针.然后接受 List<Control*>
  • 将您的函数设为模板。您仍然可以使用 List<Button>List<Control>然后,但它更多的是样板代码,而且大多数时候都不需要。

这是第二种选择的代码。第一种选择已经由其他答案解释:

class MyWindow {
template<typename T>
void doSomething(List<T> & l) {
// do something with the list...
if(boost::is_same<Control, T>::value) {
// special casing Control

} else if(boost::is_same<Button, T>::value) {
// special casing Button

}

}
};

限制doSomething仅适用于 List<derived from Control> ,需要更多代码(如果您想知道,请查找 enable_if)。

请注意,这种代码(看你有什么类型)是要避免的。你应该用虚函数来处理这些事情。添加功能doSomething到 Control,并在 Button 中覆盖它。

关于C++ 模板和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/315218/

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