【问题标题】:Diamond inheritance code in C++ not working as expectedC++ 中的 Diamond 继承代码未按预期工作
【发布时间】:2013-09-25 19:40:03
【问题描述】:

我正在尝试理解 C++ 中菱形问题(多重继承)的解决方案。

我编写此代码是为了更好地理解解决方案,但它的行为与预期不符。

#include <stdio.h>

class A
{
public:
    void Print()
    {
        printf("A\n");
    }
};

class B : virtual public A
{
public:
    void Print()
    {
        printf("B\n");
    }
};

class C : virtual public A
{
public:
    void Print()
    {
        printf("C\n");
    }
};

class D : public B, public C
{
};

int main()
{
    D d;
    d.Print();
}

Visual Studio 2008 速成版大喊: 错误 C2385:“打印”的不明确访问 1> 可能是基础“B”中的“打印” 1> 或者可能是基础“C”中的“打印” 错误 C3861:“打印”:找不到标识符

谁能告诉我我在这里缺少什么?

【问题讨论】:

  • 如果可能,升级到最新的 Visual Studio 2013

标签: c++ multiple-inheritance diamond-problem


【解决方案1】:

d.Print() 应该调用哪个版本的Print()?有两种选择。不过,您可以选择:

d.A::Print(); // this one isn't part of the overload set search without qualification
d.B::Print();
d.C::Print();

请注意,将A::Print() 设为virtual 函数将无济于事,因为没有唯一的最终覆盖函数。您需要在 D 中显式覆盖 Print()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
相关资源
最近更新 更多