小编Jac*_* V.的帖子

如果使用多个is-a继承,您是否不想使用相互基类的虚拟继承?

如果你有一个使用公共继承实现的继承关系,并且有一个继承的钻石你会有类似的东西:

  • 流类
  • 从流派生的输入流和输出流类
  • 从两者派生的输入/输出流类

在这种情况下,如在标准库(?)中使用的那样,在iostream既是-a istream又是-o ostream的情况下,istream isa-a stream而ostream是-stream,而且它们是相同的流,流中的任何函数,应用于iostream是有意义的,应该处理相同的底层结构.

在C++中,为了能够共享istream和ostream中的流副本,它必须由它们虚拟地继承.

但是,如果您愿意,则无法虚拟继承,并且每次引用基类的成员时,请指定所需的两个副本(istream中的一个或ostream中的一个)(通过强制转换或使用范围) ::等等).

我的问题是,[编辑:有没有其他情况]除了"这不是一个真正的关系,我使用naughtily使用的公共继承作为语法上的方便,当它在概念上没有"或"我从来没有需要从最派生的类中多态地引用基类,因此非常小的开销是不值得的",有任何理由它在概念上有效继承非虚拟的并且有两个基类副本,一个为每个姐妹中级班?

c++ oop inheritance

23
推荐指数
1
解决办法
875
查看次数

如果它们不是随机访问,如何告诉advance()在输入迭代器上使用+ =运算符

考虑一个输入迭代器join_iterator:它迭代其他范围的串联.调用++i反复可以比简单的慢i += n.

尽管如此,大多数C++代码都要求使用任意数量的迭代器,当迭代器不是随机访问时std::advance,它会自动转向调用++i.

(可悲的是,大多数人使用std::advance(i, n)而不是using std::advance; advance(i, n),所以我不能只advance为我的迭代器供应并依赖ADL.)

另一方面,我不能使用++=因为输入迭代器不必实现它们.

所以问题是:在以下情况下,我将如何支持这种情况:

  • 实现这样的迭代器?

  • 使用可能具有优化的输入迭代器operator +=

(注意advance并且+这不是唯一重要的情况 - distance并且-具有相同的问题.)

c++ iterator

16
推荐指数
1
解决办法
303
查看次数

"朋友"类是否扩展到该类中声明的类?

我有以下代码,其中类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中提到过吗?如果有的话,标准会破坏哪种行为?

c++ friend

15
推荐指数
1
解决办法
1237
查看次数

标签 统计

c++ ×3

friend ×1

inheritance ×1

iterator ×1

oop ×1