C++ 如何在类声明之外实现显式重写?

C++ 如何在类声明之外实现显式重写?,c++,interface,overriding,visual-studio-2005,definition,C++,Interface,Overriding,Visual Studio 2005,Definition,我有两个类使用相同的纯虚拟方法: class InterfaceA { public: virtual void doSomething() = 0; }; class InterfaceB { public: virtual void doSomething() = 0; }; 我有一个从这些接口派生的类。我想撤销 每个虚拟函数。我可以这样做(这样做有效): 然而,我的问题是,如何在类声明之外有我的方法定义?所以我可以把它们放在我的.cpp文件中。我先试了一下: // .h

我有两个类使用相同的纯虚拟方法:

class InterfaceA
{
    public: virtual void doSomething() = 0;
};
class InterfaceB
{
    public: virtual void doSomething() = 0;
};
我有一个从这些接口派生的类。我想撤销 每个虚拟函数。我可以这样做(这样做有效):

然而,我的问题是,如何在类声明之外有我的方法定义?所以我可以把它们放在我的.cpp文件中。我先试了一下:

// .h
class ConcreteClass : public InterfaceA, public InterfaceB
{
    public:

    void InterfaceA::doSomething() override;
    void InterfaceB::doSomething() override;
};
// .cpp
void ConcreteClass::InterfaceA::doSomething()
{
    printf( "In ConcreteClass::InterfaceA::doSomething()\n" );
}
void ConcreteClass::InterfaceB::doSomething()
{
    printf( "In ConcreteClass::InterfaceB::doSomething()\n" );
}

这在Visual C++ 2005(VS 2005)中没有编译:

它是否需要特定的sintax才能编译

微软的MSDN文档有一个有效的例子。但是他们使用他们的接口扩展。如果可能的话,我想实现与标准c++03相同但符合标准c++03的代码


谢谢

尽管它并不完全是您想要的,但显而易见的解决方法是分派到帮助器函数:

class ConcreteClass : public InterfaceA, public InterfaceB
{
public:
    void InterfaceA::doSomething() override {
        InterfaceA_doSomething();
    }

    void InterfaceB::doSomething() override {
        InterfaceB_doSomething();
    }

 private:
    void InterfaceA_doSomething();
    void InterfaceB_doSomething();
};

尽管它并不完全是您想要的,但显而易见的解决方法是分派到帮助器函数:

class ConcreteClass : public InterfaceA, public InterfaceB
{
public:
    void InterfaceA::doSomething() override {
        InterfaceA_doSomething();
    }

    void InterfaceB::doSomething() override {
        InterfaceB_doSomething();
    }

 private:
    void InterfaceA_doSomething();
    void InterfaceB_doSomething();
};

override
关键字是c++11的一个特性,VS 2005使用在创建该规范之前编写的编译器。实际上,实现虚拟功能并不需要指定
覆盖
。我建议尝试删除关键字。@Nicolas我使用的是当时使用的MS扩展名。我可能不应该在这个例子中使用它来让它更清楚。但是,移除它并不能解决问题:(ThanksOK,那么你的问题实际上是来自两个接口的同名函数?@Nicolas,我想做的是将方法定义移到类声明之外的.cpp文件中。同名函数不是问题所在,事实上,这正是我想要的。Tathe
override
关键字是c++11的一个功能,并且VS 2005使用在该规范创建之前编写的编译器。实际上,实现虚拟函数并不需要指定
覆盖
。我建议尝试删除关键字。@Nicolas我使用的是当时使用的MS扩展名。我可能不应该在本例中使用它来让它更清晰。但是,删除它并不能解决问题:(ThanksOK,那么你的问题实际上是来自两个接口的同名函数?@Nicolas,我想做的是将方法定义移动到我的.cpp文件中,在类声明之外。同名函数不是问题,事实上,这是我想要的.Ta
class ConcreteClass : public InterfaceA, public InterfaceB
{
public:
    void InterfaceA::doSomething() override {
        InterfaceA_doSomething();
    }

    void InterfaceB::doSomething() override {
        InterfaceB_doSomething();
    }

 private:
    void InterfaceA_doSomething();
    void InterfaceB_doSomething();
};