【发布时间】:2011-01-01 13:36:30
【问题描述】:
有两个基类具有相同的函数名。我想继承它们,并以不同的方式覆盖每种方法。如何使用单独的声明和定义(而不是在类定义中定义)来做到这一点?
#include <cstdio>
class Interface1{
public:
virtual void Name() = 0;
};
class Interface2
{
public:
virtual void Name() = 0;
};
class RealClass: public Interface1, public Interface2
{
public:
virtual void Interface1::Name()
{
printf("Interface1 OK?\n");
}
virtual void Interface2::Name()
{
printf("Interface2 OK?\n");
}
};
int main()
{
Interface1 *p = new RealClass();
p->Name();
Interface2 *q = reinterpret_cast<RealClass*>(p);
q->Name();
}
我未能在 VC8 中将定义移出。我发现 Microsoft 特定关键字 __interface 可以成功完成这项工作,代码如下:
#include <cstdio>
__interface Interface1{
virtual void Name() = 0;
};
__interface Interface2
{
virtual void Name() = 0;
};
class RealClass: public Interface1,
public Interface2
{
public:
virtual void Interface1::Name();
virtual void Interface2::Name();
};
void RealClass::Interface1::Name()
{
printf("Interface1 OK?\n");
}
void RealClass::Interface2::Name()
{
printf("Interface2 OK?\n");
}
int main()
{
Interface1 *p = new RealClass();
p->Name();
Interface2 *q = reinterpret_cast<RealClass*>(p);
q->Name();
}
但是是否有另一种方法可以在其他编译器中使用更通用的方法?
【问题讨论】:
-
你为什么要这个?看来您正在破坏虚拟功能的目的;您只是在复制非虚拟语义。你有
__interface的参考吗?我查了一下,它似乎没有做任何必要的事情。 -
Potatoswatter - 你可能需要这样做的原因是你可能有一个类,它通过从两个接口继承来汇集两个不同的概念。类的用户很可能通过接口使用它,两个不同接口的用户互不了解或不关心。该类将这些结合在一起,需要区分对一个接口的调用和对另一个接口的调用。您绝不会违背虚函数的目的。 Gohan - 如果 __inteface 在这里有所作为,我会感到惊讶。
-
@Len 不同的是,如果你想直接把implement 部分移出,__interface 关键字会使其工作,而使用标准类或结构只包含纯虚函数会得到编译器的错误。
-
@Potatoswatter “你只是在复制非虚拟语义。”“复制非虚拟语义”到底是什么意思?
-
那么,
Interface1::Name是一个un限定名称吗?
标签: c++ visual-c++ gcc multiple-inheritance