Visual Studio 2010的C ++多重继承解决问题导致C2509错误

时间:2011-02-25 17:30:21

标签: c++ visual-studio-2010 multiple-inheritance

我正在尝试在非托管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 个答案:

答案 0 :(得分:2)

Base1::Func在你的“作品”情况下无效,它只是被编译器接受。

如果您想要两个不同的功能将它们称为两个不同的名称。如果需要一个函数,请使用虚拟继承:

编辑:修改评论 class Base1 : public virtual Baseclass Base2 : public virtual Base

然后从函数覆盖中删除基本限定。