2012-02-27 150 views
0

它的确定,具有共享功能

class A 
{ 
    virtual x() = 0; 
    virtual y() = 0; 
} 

class B 
{ 
    virtual x() = 0; 
    virtual z() = 0; 
} 

class C : A , B 
{ 
    x(); 
    y(); 
    z(); 
} 

与两个库,其一个仅知道A和另一个的共享类C的实例只知道B?

像:

库1:

#include <a> 

A* a = function_in_the_core_that_creates_a_C_and_retrieves_it(); 
a->x(); 
a->y(); 

库1:

#include <b> 

B* b = function_in_the_core_that_creates_a_C_and_retrieves_it(); 
b->x(); 
b->z(); 

我问这个,因为我不知道如果编译器都会有问题要解决,因为该功能图书馆没有C的祖先的全部知识。

编辑:

function_in_the_core_that_creates_a_C_and_retrieves_it()应该返回一个C *不是C.我认为这是明显的,因为我们正在谈论虚函数。

回答

1

你真的应该让代码编译。 C私下继承A和B,所以这个例子不会运行。 class C : public A , public BC的更正声明。你也缺少函数的返回类型。

要么function_in_the_core_that_creates_a_C_and_retrieves_it会返回一个B*,然后将顺应B充分血统和工作的B对所有意图和目的 - 或者它会返回一个C*,在这种情况下,你必须提供一个完整的声明的C为了赋值工作没有明确的演员。你不能只有C宣布这样做。

所以,你要么返回一个指针B在这种情况下没有问题 - 或指向C,您将需要提供完整的祖先为了使分配没有潜在危险的演员。

+0

当我说:“共享类C的实例”,我的意思是返回一个C *。我的问题是,如果由核心返回一个C *,每个库都会找到他们想要的函数,因为他们对C没有任何了解。 – user246100 2012-02-27 13:05:11

+0

这是行不通的。你需要提供'C'的完整定义才能返回一个指针。如果你返回一个只是向前声明的'C *',它将不会运行,并且你将无法安全地将它转换为'A'或'B'。它或者是一个'C'实现,或者是写两个函数分别返回'A'或'B'。 – Dervall 2012-02-27 13:09:49

+0

要清楚的是,如果您提供'C'的前向声明或完整声明,则只能返回指向'C'的指针。前向声明将转换为B或A是非法的。 – Dervall 2012-02-27 13:12:16

1

现在,没有。你在这两种情况下都调用相同的函数。唯一可行的方法是返回C*。如果知道C的定义(并且还需要继承是公共的),才能转换为A*B*

如果你有两个独立的功能,一个返回A*和一个返回B*,那就没事了。每个基类子对象都包含足够的信息,以便虚拟调度和RTTI正常工作,而无需了解对象的动态类型。

+0

X应该是相同的功能。我的问题是,通过核心传递一个C *,每个库都会找到他们想要的函数,因为他们对C没有任何了解。 – user246100 2012-02-27 13:03:35

+0

@ user246100:在这种情况下,我的第一段回答你的问题 - 没有定义的'C'(和公共继承),函数结果不能转换为指向任何一个基类的指针。 – 2012-02-27 13:09:32