2014-11-14 88 views
4

下面的代碼令人驚訝地編譯在VS 2012中。一次覆蓋兩種方法

方法C :: f()覆蓋了兩個基類中的方法。

這是標準行爲嗎?我研究了C++ 11標準,並沒有明確提到這種情況。

class A { virtual void f() = 0; }; 

class B { virtual void f() = 0; }; 

class C : public A, public B { 
    virtual void f() override { } 
}; 

回答

7

是的。標準說,在C++ 11 10.3/2

如果虛擬成員函數vf在類Base和在類Derived被聲明,從基地成員函數vf用相同的直接或間接衍生名稱[等] Base::vf被宣佈,然後覆蓋Base::vf

對於多個基類沒有特殊情況,所以在派生類中聲明的函數將覆蓋所有基類中的適當函數。

+0

是的,我讀的標準相同的部分,並沒有直接說'在所有的基礎班級「,但現在你向我保證。謝謝! – Maxym 2014-11-14 16:17:40

3

香草薩特解釋瞭如何處理這個here

根據文章:

class B1 { 
    public: 
    virtual int ReadBuf(const char*); 
    // ... 
}; 

class B2 { 
    public: 
    virtual int ReadBuf(const char*); 
    // ... 
}; 

class D : public B1, public B2 { 
    public: 
    int ReadBuf(const char*); // overrides both B1::ReadBuf and B2::ReadBuf 
}; 

這將覆蓋這兩個函數具有相同執行

+0

非常好的參考,謝謝! – Maxym 2015-01-12 12:08:54