1

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

文件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
};

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

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

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

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

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

4

1 回答 1

1

在继承的其他东西中,有注入类名称。您可以将它们视为隐藏类型别名:其中class A有类似using A = A;的东西,指向它自己。

请记住,private默认情况下是类继承。

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

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

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


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

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;
};
于 2021-10-31T09:44:42.610 回答