可能最好用一个例子来解释:
struct A
{
virtual void foo() = 0;
};
struct B
{
virtual void foo() = 0;
};
struct C : A, B
{
// Implementation of A::foo
void A::foo();
// Implementation of B::foo
void B::foo();
};
// Define here; howto?
我知道我可以用类内联定义函数,但是在这个实例中这是不可行的(大约有6个基类用40多种方法实现)
-
显然我不够清楚。问题直接是:如何定义已被继承的foo()方法而不会引起歧义问题?
以下确实有效
void C::foo() { /* etc */ }
这将定义A :: foo()的实现,还有B :: foo()的实现?请记住,我不希望在C的声明中定义方法。
P.S。,根据这种方式建模问题的原因是预定义的(COM / OLE)
-
这很好(MSVC)虽然内联:
struct A { virtual int foo() = 0; };
struct B { virtual int foo() = 0; };
struct C : A, B
{
int A::foo() { return 1; }
int B::foo() { return 2; }
};
void main()
{
C* p = new C();
cout << ((A*) p)->foo();
cout << ((B*) p)->foo();
}
答案 0 :(得分:1)
按预期工作:
struct A { virtual void foo() = 0; };
struct B { virtual void foo() = 0; };
struct C : A, B { virtual void foo(); };
void C::foo() { }
对于任何C x;
,static_cast<A&>(x).foo()
和static_cast<B&>(x).foo()
将按预期调用x.foo()
,这正是A
和{{的纯虚拟接口1}}承诺。