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文件中。同名函数不是问题所在,事实上,这正是我想要的。Tatheoverride
关键字是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();
};