1

我试图理解 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:“打印” : 未找到标识符

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

4

1 回答 1

1

Print()应该d.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无济于事,因为没有唯一的最终覆盖函数。您需要Print()D.

于 2013-09-25T19:49:32.577 回答