現實世界中,託關係的現象家常便飯。託個關係,就能比別人少奮鬥好多年,這未免讓許多無背景的屌絲碼農扼腕長嘆。但更使人絕望的是,C++ 裏竟也有相似的狀況。ios
話很少說,上例子:ide
cpp#include <iostream> using namespace std; class B { public: virtual void f() { cout << "virtual function" << endl; } }; class D : public B { private: void f() { cout << "private function" << endl; } }; int main() { D d; B* pb = &d; pb->f(); }
輸出:函數
private function
對於 D
類來講,f()
分明是一個 private
的成員。咱們卻用了一些小手段,繞開了權限,成功的調用了它。這是否是有違 OO 的設計原則呢?spa
定定神,細細看,發現這原來是被爹給坑了。父類 B
中居然爲 f()
這個虛方法開了 public
權限。以致於無恥之輩,賄賂兒子碰了灰,竟去找他爹託關係!愣是讓丫得逞了。。。設計
好吧,扯淡到此結束。這個例子其實脫胎於 C++11 的標準(草稿N3690)。code
11.5 Access to virtual functions [class.access.virt]get
- The access rules (Clause 11) for a virtual function are determined by its declaration and are not affected by the rules for a function that later overrides it. [Example:
cppclass B { public: virtual int f(); }; class D : public B { private: int f(); }; void f() { D d; B* pb = &d; D* pd = &d; pb->f(); // OK: B::f() is public, // D::f() is invoked pd->f(); // error: D::f() is private }
—end example]it
注意加粗的地方。虛方法的權限只由其聲明肯定,並不受後續 override 函數權限的影響。io
以此爲戒。function