2014-02-25 86 views
0

这里派生类中有我的课:C++从两个相同的基类

class Base1 
{ 
public: 
    Base1(); 
    ~Base1(); 

    virtual void main_func()=0; 
} 

class D1 : public Base1 
{ 
public: 
    D1(); 
    ~D1(); 

    virtual void main_func(do_d1_main();); 
} 
class D2 : public Base1 
{ 
public: 
    D2(); 
    ~D2(); 

    virtual void main_func(){do_d2_main();}; 
} 

class Base2 
{ 
public: 
    Base2(); 
    ~Base2(); 

    int m_needed_by_b1; 
} 
class D12B2: public Base2, public D1, public D2 
{ 
public: 
    D12B2(); 
    ~D12B2(); 
} 

这里的问题:

两个do_main_func1()do_main_func2()需要Base2访问成员m_needed_by_b1。怎么样?

我可以为class D12B2中的每个定义虚拟函数main_func吗?这将使他们能够访问所有D12B2,包括Base2。我将如何分别指定每个?

我曾考虑在Base1中添加(受保护)成员,即指向Base2对象的指针。这将必须由D12B2设置。似乎可能有一个更优雅的方式来做到这一点。

TIA

+0

做到这一点(有些人不喜欢)的一种方法是使用多重继承;使'D1'和'D2'分别来自*'Base1'和'Base2'。 – Brian

+1

在'do_d1_main','do_d2_main','do_main_func1'和'do_main_func2'之间,您已经在代码或描述中指定了四件事情,其中​​没有任何定义。 'do_d1_main'和'do_main_func1'(以及它们的'd2'的对应部分)应该是相同的函数吗? – WhozCraig

+1

这通常被认为是[设计/代码气味](http://c2.com/cgi/wiki?CodeSmell) –

回答

0

好像有可能是一个更优雅的方式来做到这一点。

更可能的是,有 - 不使用多重继承。

但是,如果你要坚持使用多重继承,也有一些事情你必须注意:D1D2应在无形中被D12B2继承,避免钻石的问题。假设do_d1_maindo_d2_main实际上意味着main_func,那么您可以实施D12B2::main_func,这将能够访问m_needed_by_b1

但是,回到原注:

这听起来像Base1Base2不应该存在的,并且D1D2应该是纯粹的抽象类。这将使你与

class D1 
{ 
public: 
    virtual void d1_func() = 0; 
}; 

class D2 
{ 
public: 
    virtual void d2_func() = 0; 
}; 

class D12B2 : public virtual D1, public virtual D2 
{ 
public: 
    D12B2(); 
    ~D12B2(); 

    virtual void d1_func() 
    { 
     // do something 
    } 

    virtual void d2_func() 
    { 
     // do something else 
    } 

private: 
    int m_myData; 
}; 
+0

“......以避免钻石问题。”你的意思是“执行*钻石模式”吗?没有虚拟继承,就没有钻石,这可能是一个问题。 – WhozCraig

+0

@WhozCraig我的意思是说它可以避免模糊的函数声明问题 - 这就是我所指的[钻石问题](http://www.cprogramming.com/tutorial/virtual_inheritance.html)。 –

+0

是的,D1和D2应该虚拟继承,以避免钻石。对不起,我把它留下了。但是,两个基类都是需要的(至少我是这么认为的)。例如:base1是一个线程类,它在一个单独的线程中创建并运行'thread_main()'。我定义了两个不同的线程类:音频和视频(这些是D1和D2)。 Base2是一个通用设备类,它具有音频和视频线程所需的功能。 D12B2是具有音频线程和视频线程的特定设备。 – user3182551

相关问题