【问题标题】:`using` keyword for default behaviour from the base class`using` 关键字用于基类的默认行为
【发布时间】:2013-12-10 16:20:25
【问题描述】:

我不太明白什么时候需要using 关键字。当您想使用基类中的函数或对象时,您是否总是需要它?我发现即使我没有重载该功能,我也必须使用它。

【问题讨论】:

标签: c++ overloading using derived-class


【解决方案1】:

只有两种情况需要在类中使用using。首先是当您在类中定义一个与基类中同名的函数时,并且您希望在考虑两者的情况下使用重载。另一种是当你想使用基类构造函数作为派生构造函数时。

【讨论】:

  • 如果基类是模板,这条规则有什么不同吗?
  • @Plamen,我不明白为什么有一个基类的模板会产生任何影响,但我无法明确说明。
  • 感谢您的回答!我认为如果使用模板确实会有所不同。我一直在运行一些测试,似乎编译器无法确定在使用模板参数时要做什么。我在基础中有一个函数stupid,如果我在派生中使用它会得到error: there are no arguments to 'stupid' that depend on a template parameter, so a declaration of 'stupid' must be available [-fpermissive](它没有重新声明,只是使用)。
【解决方案2】:

当您在派生类中重载相应名称​​并且您想让基类重载可见时,您只需要基类成员的using-指令。当你不重载 detived 类中的名称时,你根本不需要using-directive。

背景是,如果对基类的更改会劫持函数重载,这被认为是令人惊讶的。因此,默认情况下隐藏基类的重载。如果你想让它们被使用,你就是在做一个明确的改变。

让我们假设该规则不存在,并考虑定义成员f(double) 的派生类,该成员称为object.f(0)。如果基类更改为提供f(int) 并且重载可见,则新函数将是更好的匹配。也就是说,在行为被默默改变之前不可见。这可能是个坏主意。

【讨论】:

    【解决方案3】:

    如果你处理命名空间,你必须使用它。例如:

    using namespace std;
    using std::cout;
    using std::endl;
    // without that you have to type it in following way
    std::cout << std::endl;
    // which is not the best way if you use it very often,
    // but good if you want to use some names in your code
    

    这允许您使用一些具有命名空间的库。它是为封装(隐藏)变量、类和方法而创建的,否则它会占用更多的命名空间并禁止您在项目中使用某些名称。

    【讨论】:

    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    相关资源
    最近更新 更多