如果你有一个使用公共继承实现的继承关系,并且有一个继承的钻石你会有类似的东西:
在这种情况下,如在标准库(?)中使用的那样,在iostream既是-a istream又是-o ostream的情况下,istream isa-a stream而ostream是-stream,而且它们是相同的流,流中的任何函数,应用于iostream是有意义的,应该处理相同的底层结构.
在C++中,为了能够共享istream和ostream中的流副本,它必须由它们虚拟地继承.
但是,如果您愿意,则无法虚拟继承,并且每次引用基类的成员时,请指定所需的两个副本(istream中的一个或ostream中的一个)(通过强制转换或使用范围) ::等等).
我的问题是,[编辑:有没有其他情况]除了"这不是一个真正的关系,我使用naughtily使用的公共继承作为语法上的方便,当它在概念上没有"或"我从来没有需要从最派生的类中多态地引用基类,因此非常小的开销是不值得的",有任何理由它在概念上有效继承非虚拟的并且有两个基类副本,一个为每个姐妹中级班?
考虑一个输入迭代器join_iterator
:它迭代其他范围的串联.调用++i
反复可以多比简单的慢i += n
.
尽管如此,大多数C++代码都要求使用任意数量的迭代器,当迭代器不是随机访问时std::advance
,它会自动转向调用++i
.
(可悲的是,大多数人使用std::advance(i, n)
而不是using std::advance; advance(i, n)
,所以我不能只advance
为我的迭代器供应并依赖ADL.)
另一方面,我不能使用+
或+=
因为输入迭代器不必实现它们.
所以问题是:在以下情况下,我将如何支持这种情况:
实现这样的迭代器?
使用可能具有优化的输入迭代器operator +=
?
(注意advance
并且+
这不是唯一重要的情况 - distance
并且-
具有相同的问题.)
我有以下代码,其中类A将类B声明为朋友.在B类中声明的C类是否能够查看A类的私有声明/成员?
它与CL版本16(Visual Studio 2010)一起编译时没有错误,但是gcc g ++版本4.1.1给出了错误"typedef int A :: T在此上下文中是私有的".
函数调用为typedef时会出现相同的行为(这就是我发现差异的方式).
class A {
friend class B;
typedef int T;
};
class B {
A::T t; // ok
typedef A::T U; // ok
class C {
U u; // ok
A::T v; // compile error on gcc
};
};
Run Code Online (Sandbox Code Playgroud)
我已经简要地看过了,但是找不到合适的搜索词.我还没读完标准.以前有关于这个主题的问题,或者在C++ FAQ中提到过吗?如果有的话,标准会破坏哪种行为?