【发布时间】: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