下面的代碼令人驚訝地編譯在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 { }
};
下面的代碼令人驚訝地編譯在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 { }
};
是的。標準說,在C++ 11 10.3/2
如果虛擬成員函數
vf
在類Base
和在類Derived
被聲明,從基地成員函數vf
用相同的直接或間接衍生名稱[等]Base::vf
被宣佈,然後覆蓋Base::vf
。
對於多個基類沒有特殊情況,所以在派生類中聲明的函數將覆蓋所有基類中的適當函數。
香草薩特解釋瞭如何處理這個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
};
這將覆蓋這兩個函數具有相同執行
非常好的參考,謝謝! – Maxym 2015-01-12 12:08:54
是的,我讀的標準相同的部分,並沒有直接說'在所有的基礎班級「,但現在你向我保證。謝謝! – Maxym 2014-11-14 16:17:40