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 ===|
这就是我认为问题的核心所在。我不能从继承自同一个类的两个类继承吗?
答案 0 :(得分:1)
您需要使用虚拟继承从idatastream
继承odatastream
和base_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
。
我希望我回答你的问题。