相关疑难解决方法(0)

为什么C++不允许继承友谊?

为什么友谊至少可以在C++中继承?由于显而易见的原因,我认为传递性和反身性是被禁止的(我说这只是为了避开简单的常见问题解答引用答案),但缺乏一些令virtual friend class Foo;我困惑的东西.有谁知道这个决定背后的历史背景?友谊真的只是一个有限的黑客,从那以后,它已经进入一些不起眼的可敬用途吗?

编辑澄清:我说的是以下场景,而不是 A的孩子接触B或B及其子女的情况.我还可以想象可以选择授予访问朋友功能等的覆盖的权限.

class A {
  int x;
  friend class B;
};

class B {
  // OK as per friend declaration above.
  void foo(A& a, int n) { a.x = n; }
};

class D : public B { /* can't get in A w/o 'friend class D' declaration. */ };
Run Code Online (Sandbox Code Playgroud)

接受的答案:正如Loki所说,通过在受限制的基类中创建受保护的代理函数,可以或多或少地模拟效果,因此不需要向类或虚方法层次结构授予友谊.我不喜欢需要样板代理(有条件的基础有效地成为),但我认为这被认为比大多数时候更容易被滥用的语言机制更可取.我想这可能是我购买和阅读Stroupstrup的C++的设计和演变的时候了,我已经看到这里有足够多的人推荐,以便更好地洞察这些类型的问题......

c++ inheritance language-design friend

86
推荐指数
4
解决办法
5万
查看次数

使用'using'关键字使继承的构造函数public

我正在尝试测试我班级的受保护方法和构造函数.为此,我尝试将其子类化,并使用C++ 11 using关键字将其成员重新导出为public :

class Foo {
  protected:
   Foo(int i) {}
   void run() {}
};

class TestableFoo : public Foo {
  public:
   using Foo::Foo;
   using Foo::run;
};

int main() {
  TestableFoo foo(7);
  foo.run();
}
Run Code Online (Sandbox Code Playgroud)

但是,g ++和clang ++都无法编译它,产生以下错误:

test.cpp:13:15: error: ‘TestableFoo::TestableFoo(int)’ is protected
    using Foo::Foo;
               ^
test.cpp:18:16: error: within this context
   TestableFoo foo(7);
                    ^
Run Code Online (Sandbox Code Playgroud)

即使run方法公开(我单独确认),TestableFoo构造函数仍然受到保护.为什么会这样?我可以理解决策(继承与覆盖可见性),但为什么方法和构造函数之间存在不一致?

c++ testing inheritance using c++11

9
推荐指数
1
解决办法
741
查看次数

标签 统计

c++ ×2

inheritance ×2

c++11 ×1

friend ×1

language-design ×1

testing ×1

using ×1