c – 继承与朋友:安全机制?

我遇到了一个有趣的理论,我想知道是否存在针对此问题的安全机制.

class Base
{
 private:
 virtual void a(){};
 friend class C;
}

class Derived: public Base
{
void a() override {};
}

class C{

public doSomething(const Base& b) {b.a();};

}

所有这些都是合法的 – C类是base的朋友,因此可以调用b.a().但是,当它收到引用时,它可以接收对Derived对象的引用,因此C将访问Derived类中的私有区域,而不是派生的朋友.

这只是糟糕的代码设计还是有安全防范这个?覆盖运算符<<<<<<<<对于基础,并从内部调用一般打印功能(运算符是基地的朋友).

解决方法:

作为设计的骨架(Base和Derived),这是一个典型的优秀设计,由Herb Sutter 15 years ago提倡 – 除了让C级朋友变得多余,因为它可以调用公共函数run().只有当需要使用a()时,C才需要成为朋友,以防run()有更多功能要避免(我怀疑在这种情况下设计不好).
我想知道我的阅读有什么问题,因为,与之前的答案不同,我没有看到a()是公开的,也没有看到Base是私人基础.
请享用

上一篇:第一个微信项目


下一篇:IT常用术语