我的问题是关于以下代码为什么会表现出这种行为。我不是在询问设计的质量(我知道有些人会立即反感多重继承,我在这里不想争论赞成或反对)。我可以提出一个单独的问题,探讨作者试图实现什么,但是让我们假设存在等效于此代码的代码:-
这段代码在Visual Studio 2017上可以编译通过,但会出现警告C4250:“ReadableData”继承“Data::Data::getX”的方式具有优先权。
起初,我感到有点惊讶,并未被告知ReadableData没有实现getX(因为其实现是私有的),但没有警告发生,我可以创建一个ReadableData,但尽管ReadableData公开继承了IReadableData,但无法访问IReadableData的公共方法。
然而以下内容确实编译通过。
这对我来说似乎不一致,要么r是IReadableData并且getX应该可用,要么它不是,那么对r2的赋值(或ReadableData的定义)应该失败。这种情况是否应该发生?标准中的哪些内容导致了这种情况?
这个问题: 带有混合继承修饰符(protected / private / public)的菱形继承 似乎有关联,但在那种情况下基类不是抽象的,它的答案引用第11.6节使我认为r.getX();应该是可访问的。
编辑:我稍微修改了示例代码,以便稍微了解意图,但实际上并没有改变问题。
class IReadableData
{
public: virtual int getX() const = 0;
};
class Data : public virtual IReadableData
{
public:
virtual int getX() const { return m_x; }
void setX(int x) {m_x = x;}
private:
int m_x;
};
class ReadableData : private Data, public virtual IReadableData
{
// I'd expected to need a using here to expose Data::getX
};
这段代码在Visual Studio 2017上可以编译通过,但会出现警告C4250:“ReadableData”继承“Data::Data::getX”的方式具有优先权。
起初,我感到有点惊讶,并未被告知ReadableData没有实现getX(因为其实现是私有的),但没有警告发生,我可以创建一个ReadableData,但尽管ReadableData公开继承了IReadableData,但无法访问IReadableData的公共方法。
ReadableData r;
// r.getX(); error C2247: 'Data::getX' not accessible because 'ReadableData' uses 'private' to inherit from 'Data'
然而以下内容确实编译通过。
ReadableData r;
IReadableData& r2 = r;
r2.getX();
这对我来说似乎不一致,要么r是IReadableData并且getX应该可用,要么它不是,那么对r2的赋值(或ReadableData的定义)应该失败。这种情况是否应该发生?标准中的哪些内容导致了这种情况?
这个问题: 带有混合继承修饰符(protected / private / public)的菱形继承 似乎有关联,但在那种情况下基类不是抽象的,它的答案引用第11.6节使我认为r.getX();应该是可访问的。
编辑:我稍微修改了示例代码,以便稍微了解意图,但实际上并没有改变问题。