Проблема разрешения множественного наследования в C ++ с Visual Studio 2010 приводит к ошибке C2509 - PullRequest
1 голос
/ 25 февраля 2011

Я пытаюсь сделать что-то вроде явной реализации интерфейса C # в неуправляемом C ++.Я могу сделать это, пока реализация функции является частью определения класса, но я не могу понять, как заставить его работать с реализацией функции в исходном файле.

Вот мой тестовый код:

class Base
{
public:

    virtual void    Func() = 0;

    void    CallFunc()
    {
        Func();
    }
};

class Base1 : public Base
{
public:

    virtual void    Func() = 0;
};

class Base2 : public Base
{
public:

    virtual void    Func() = 0;
};

// This Works

class Multi : public Base1, public Base2
{
public:

    virtual void    Base1::Func()
    {
        puts("Base1::Func()");
    }

    virtual void    Base2::Func()
    {
        puts("Base2::Func()");
    }
};


// This does not

//  1>multipeinheritancetest.cpp(60): error C2509: 'Func' : member function not declared in 'Multi'
//  1>          multipeinheritancetest.cpp(51) : see declaration of 'Multi'
//  1>multipeinheritancetest.cpp(65): error C2509: 'Func' : member function not declared in 'Multi'
//  1>          multipeinheritancetest.cpp(51) : see declaration of 'Multi'
/*
class Multi : public Base1, public Base2
{
public:

    virtual void    Base1::Func();
    virtual void    Base2::Func();
};

void Multi::Base1::Func()
{
    puts("Base1::Func()");
}

void Multi::Base2::Func()
{
    puts("Base2::Func()");
}
*/

// This is a work-around for when I don't want to declare the full function in the header
/*
class Multi : public Base1, public Base2
{
public:

    virtual void    Base1::Func() { Base1_Func(); }
    virtual void    Base2::Func() { Base2_Func(); }

    void    Base1_Func();
    void    Base2_Func();
};

void Multi::Base1_Func()
{
    puts("Base1_Func()");
}

void Multi::Base2_Func()
{
    puts("Base2_Func()");
}
*/

void RunMultiTest()
{
    Multi m;
    m.Base1::CallFunc();
    m.Base2::CallFunc();
}

Есть ли способ сделать это, и мой синтаксис просто выключен, или это ошибка Visual Studio, или это просто невозможно с C ++?

1 Ответ

2 голосов
/ 25 февраля 2011

Base1::Func также недопустимо в вашем случае "работ", оно просто принимается вашим компилятором.

Если вы хотите, чтобы две разные функции называли их двумя разными именами .Если вам нужна одна функция, используйте виртуальное наследование:

EDIT: исправлено из комментария class Base1 : public virtual Base и class Base2 : public virtual Base

, а затем удалите базовую квалификацию из переопределения функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...