無處不在的託關係

現實世界中,託關係的現象家常便飯。託個關係,就能比別人少奮鬥好多年,這未免讓許多無背景的屌絲碼農扼腕長嘆。但更使人絕望的是,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

  1. 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

相關文章
相關標籤/搜索