2013-01-05 182 views
3

考虑下面的代码定义函数。 这种情况如何解决? 这个问题看起来类似钻石继承,但我看不到解决方案。派生类通过基类

编辑:谢谢,这是工作示例:

#include "stdio.h" 

struct A 
{ 
    virtual void f() = 0; 
}; 

struct B 
{ 
    void f() 
    { 
     printf("B::f\n"); 
    } 
}; 

struct C : public A, public B 
{ 
    void f() 
    { 
     printf("C::f\n"); 
     B::f(); 
    } 
}; 

int main() 
{ 
    A* a = new C(); 
    B* b = new C(); 
    C* c = new C(); 

    printf("Calling from A\n"); 
    a->f(); 
    printf("Calling from B\n"); 
    b->f(); 
    printf("Calling from C\n"); 
    c->f(); 
} 

输出:

Calling from A 
C::f 
B::f 
Calling from B 
B::f 
Calling from C 
C::f 
B::f 
+0

只是想了解你的意图:你想'A'定义一个接口,'B'定义的实现和'C'把它们放在一起?我没有看到'B:A'的优点,因为在实现'B'时,你已经知道你正在实现的接口,对吗? – leemes

+0

我不能简单地让'B'从'A'派生出来,因为这只是我在一个更大的项目中遇到的问题的一个孤立的例子。 –

回答

3

的问题是,这两个f()功能是完全无关的,即使他们碰巧有相同名称。

如果所需的行为是为Cvirtualf()打电话B::f(),你必须明确地做到这一点:

struct C : public A, public B 
{ 
    void f(); 
}; 

void C::f() { 
    B::f(); 
} 
1

你需要重写从基类的虚函数在C。如果你想它来调用B::f,说是这样的:

struct C : A, B 
{ 
    void f() { B::f(); } 
};