【问题标题】:Why is a qualified name required after the second level of inheritance? [duplicate]为什么二级继承后需要限定名? [复制]
【发布时间】:2021-12-15 12:20:00
【问题描述】:

我遇到了一个问题,我设法解决了这个问题,但仍然想了解语言及其背后的推理。我有以下三类系统:

文件class_a.hpp

#pragma once

class A
{
public:
    A();
};

文件class_b.hpp

#pragma once

#include "class_a.hpp"

class B : A
{
public:
    B() : A() {}

    virtual double do_something(A &with_object) const;
};

文件class_c.hpp

#pragma once

#include "class_b.hpp"

class C : B
{
public:
    C() : B() {}

    double do_something(::A &with_object) const; // but differently than class B
};

现在,如果我在 C 的 do_something() 方法中使用类型 A 的完全限定名称,我会在编辑器中收到以下错误:

类型“A::A”(在“class_a.hpp”的第 27 行声明)是不可访问的 C/C++(265)

在这种情况下,有什么可能导致歧义?我当然没有重新定义或使用名称A 作为标识符。后台是否发生了使用类名的事情?

do_something() 方法的覆盖是否也保证以这种方式工作,或者是否也需要在 B 的方法中限定类型 A

任何建议和/或指针也非常感谢!

【问题讨论】:

  • 只是检查:您是故意还是无意地使用私有继承?
  • 私有继承不应该让这种情况发生。你的编译器够新吗?
  • @TanveerBadar - 不,它应该实现这一点。
  • @Passerby 老实说,我不知道有不同类型的继承。所以是的,我是偶然做的......
  • 不用担心。信不信由你,复制实际上可能是一件好事。由于您提出问题的方式不同,它现在可以作为未来可能遇到问题并以相同方式提出问题的人们的路标。

标签: c++ inheritance qualified-name


【解决方案1】:

在继承的其他东西中,有injected-class-names。你可以把它们想象成隐藏的类型别名:class A 里面有类似using A = A; 的东西,指向它自己。

请记住,类继承默认为private

由于B 私下继承自AC 无法访问A 的内容,其中包括A 的注入类名。

do_something() 方法的覆盖是否也保证以这种方式工作,或者是否还需要在 B 的方法中限定类型 A

是的,B 中的覆盖有效。由于B直接继承自B,所以无论继承是否为私有,都可以访问其所有内容。


您的代码与以下类似。我用实际的类型别名替换了注入的类名,并得到了相同的行为。

class A
{
  public:
    using A_type = A;
};

class B : A
{
  public:
    virtual double do_something(A_type &with_object) const;
};

class C : B
{
  public:
    double do_something(A_type &with_object) const;
};

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 2011-06-17
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多