多重继承模糊错误

时间:2012-04-10 22:13:34

标签: c++ gcc

好吧,我很好奇为什么gcc称这个含糊不清。检查一下:

class base_stream
{
public:
    std::string m_buffer;
};

class idatastream : public base_stream
{

};

class odatastream : public base_stream
{

};

class datastream : public idatastream, public odatastream
{
public:
    void dostuff( m_buffer = "some text";) // reference is ambiguous?
};

我在base_stream中只声明一次m_buffer,并且不在继承类中重新声明它,那么为什么当我继承这两个继承类时,m_buffer是不明确的?错误说明了这一点:

||In member function 'void datastream::dostuff()':|
|22|error: reference to 'm_buffer' is ambiguous|
|6|error: candidates are: std::string base_stream::m_buffer|
|6|error: std::string base_stream::m_buffer|
||=== Build finished: 3 errors, 0 warnings ===|

我在这里很困惑,因为有效的候选人是相同的。当我将dostuff的定义更改为:

void dostuff() {base_stream::m_buffer = "test string";}

,就像它暗示的那样,我收到了这个错误:

||In member function 'void datastream::dostuff()':|
|22|error: 'base_stream' is an ambiguous base of 'datastream'|
||=== Build finished: 1 errors, 0 warnings ===|

这就是我认为问题的核心所在。我不能从继承自同一个类的两个类继承吗?

1 个答案:

答案 0 :(得分:1)

您需要使用虚拟继承从idatastream继承odatastreambase_stream

这样的事情可能有用。

class base_stream
{
public:
    std::string m_buffer;
};

class idatastream : virtual public base_stream
{

};

class odatastream : virtual public base_stream
{

};

class datastream : public idatastream, public odatastream
{
public:
    void dostuff( m_buffer = "some text";) // reference is ambiguous?
};

因此,在这种情况下,base_stream中只会存在data_stream的一个副本,这样就可以访问m_buffer中的data_stream

我希望我回答你的问题。