gpt4 book ai didi

c++ - 多重继承导致的“无法访问的直接基础”

转载 作者:IT老高 更新时间:2023-10-28 22:01:18 25 4
gpt4 key购买 nike

剧透警告:也许是个愚蠢的问题。 :)

#include <iostream>

using namespace std;

class Base
{
public:
virtual void YourMethod(int) const = 0;
};

class Intermediate : private Base
{
public:
virtual void YourMethod(int i) const
{
cout << "Calling from Intermediate" << i << "\n";
}
};

class Derived : private Intermediate, public Base
{
public:
void YourMethod(int i) const
{
cout << "Calling from Derived : " << i << "\n";
}
};

int main()
{
}

有人可以向我解释为什么会引发编译器警告:

main.cpp:21: warning: direct base ‘Base’ inaccessible in ‘Derived’ due to ambiguity

现在,我知道这段代码无法正常工作。我想知道为什么。 BaseIntermediate 是私有(private)的,因此它不应该通过 IntermediateDerived 可见。那么歧义从何而来?在构造函数中?

最佳答案

这与覆盖函数无关。它与转换有关。它也与可访问性(即“私有(private)”等)直接无关。这是一个更简单的例子

struct A { int a; };
struct B : A { };
struct C : B, A { }; // direct A can't be referred to!

你可以通过先转换成B再转换成A来引用间接A对象:

B *b = &somec;
A *a = b;

您不能对直接 A 对象执行此操作。如果尝试直接转换成A,会有两种可能。因此,在给定 Derived 对象的情况下,不可能引用直接 A 对象的非静态数据成员。

请注意,可访问性与可见性是正交的。某些东西即使不可见也可以访问(例如,通过限定名称来引用它),即使某些东西不可访问,它也可以是可见的。即使将上述所有派生声明为 private,问题仍然会出现:最后检查访问 - 它不会影响名称查找或转换规则。

此外,任何人都可以使用 C 样式强制转换为具有已定义行为(C++ 标准对此异常(exception))的明确私有(private)基类,即使通常不会授予访问权限。然后还有 friend 和类(class)本身可以自由转换。

关于c++ - 多重继承导致的“无法访问的直接基础”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4118412/

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