我遇到一個有趣的理論,我想知道是否有一個安全機制在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類是基地的朋友,因此可以調用b.a()。但是,當它收到一個引用時,它可以接收對Derived對象的引用,因此C將訪問派生類中的私有區域,而不是派生的朋友。
這是簡單的錯誤代碼設計還是有一個安全的防範呢?當爲基礎覆蓋運營商< <,並從內部調用通用打印功能(運營商是基地的朋友)時,發生在我身上。
在C++中你有朋友,所以你可以在他們的私人部分。 – Mikhail
可視化的方式是,派生類的訪問說明符適用於通過左值的靜態類型及其後代進行訪問 - 而不是追溯性地改變其基地聲明爲通過基本左值訪問的訪問說明符,最不好的,可能是荒謬的。 –