我遇到了一个有趣的理论,我想知道是否存在针对此问题的安全机制.
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是私人基础.
请享用