讀取您可以在C++ 0x中有final virtual functions我有點困惑。首先省略兩個修飾符有什麼區別?C++中的最終虛函數0x
回答
不同之處在於它不是使用它的基礎,而是派生的。
class Base {
virtual void foo() = 0;
};
class Derived : Base {
void foo() {}
// Still virtual because it's virtual in base- no way to "un-virtual" it
virtual void foo() final {}
// Now un-overridable.
};
認爲它不是防止覆蓋,而是防止「更多」覆蓋。
謝謝!我不清楚,虛擬獲得了整個層次結構。 –
當我第一次碰到用結合的final
關鍵字來在C virtual
++,我想知道同樣的事情:
我認爲目前的accepted answer這個問題很好,但是我想基於我發現的這個問題來增加一點。
考慮下面的類:
class A {
public:
void hide_me();
virtual void override_me();
virtual void cant_override_me() final;
};
認識到的重要一點是,這三個方法聲明是完全不同的,並意味着不同的事情。
第一:
void hide_me();
是非虛擬因此,根據定義,不能被重寫。
第三種:
virtual void cant_override_me() final;
被聲明final
,並且因此不能被重寫,也通過定義。
所不同的是,由於hide_me
非虛擬的,壓倒一切的是unapplicable,而你能想到的cant_override_me
爲資格被覆蓋(因爲它是virtual
)但也已覆蓋禁用由於final
修飾符。換句話說,覆蓋不適用於未聲明爲virtual
的方法,但它適用於virtual
方法,如果它們也被聲明爲final
,則不能覆蓋它們。
現在考慮一個子類:
class B: public A {
public:
void hide_me(); // this hide's A's definition of "hide_me()"; this is not overriding.
void override_me(); // implicit "virtual"
//void cant_override_me(); // implicit "virtual"; compilation fails
};
您可以重新定義爲hide_me()
類B
,但是這僅僅是超載或hiding,因此函數名。 B
仍然可以通過A::hide_me()
訪問A
的hide_me
方法,但是參考B
的其他人聲明爲B
,即連接:my_b->A::hide_me()
B *my_b = new B();
必須訪問A
的現在隱藏的hide_me
定義。
您不能提供cant_override_me()
在B
重新定義。
作爲一個完整的例子,這裏是該計劃的一個輕微的重新定義,以幫助舉例說明這是怎麼回事:
#include <cstdio>
class A {
public:
inline void hide_me() {
printf("a hide_me\n");
}
virtual void override_me();
virtual void cant_override_me() final;
};
class B: public A {
public:
inline void hide_me() {
printf("b hide_me\n");
}
void override_me();
inline void foo() {
A::hide_me();
}
// can't override cant_override_me
};
void A::override_me() {
printf("a override_me\n");
}
void A::cant_override_me() {
printf("a cant_override_me\n");
}
void B::override_me() {
printf("b override_me\n");
}
int main (int argc, char *argv[]) {
A *a = new A();
A *ab = new B();
B *b = new B();
a->hide_me();
ab->hide_me();
b->hide_me();
b->A::hide_me();
printf("---\n");
a->override_me();
ab->override_me();
b->override_me();
b->A::override_me();
}
方案產出
a hide_me
a hide_me
b hide_me
a hide_me
---
a override_me
b override_me
b override_me
a override_me
- 1. 在C++中的「id」函數0x
- 2. C++中的特殊成員函數0x
- 3. 沒有C++ 0x的C++ lambda函數?
- 4. C++中的虛函數
- 5. C++中的虛函數
- 6. 虛函數(C++)
- 7. 虛函數C++
- 8. C++ 0x和Friend函數和boost :: make_shared
- 9. C++ 0x中
- 10. C++ - 純虛函數
- 11. 虛擬函數C++
- 12. 虛擬函數C#
- 13. C++純虛函數
- 14. 虛函數中的默認參數C++
- 15. C++:在非虛函數中使用純虛函數
- 16. 使用虛函數的C++
- 17. C++虛函數的實現?
- 18. 顯式覆蓋和最後的C++ 0x
- 19. 支持C++的最低iOS版本0x
- 20. 終止c函數
- 21. C++中的虛函數的概念
- 22. Java函數中的最終變量
- 23. C++中的線程析構函數0x與增強
- 24. C++中std :: bind的函數裝飾器0x
- 25. 在C++ 0x中有什麼新的Unicode函數?
- 26. 的C++ 0x的std ::函數作爲方法的參數
- 27. 繼承類中的C++虛函數
- 28. 什麼是C++中的僞虛函數?
- 29. C++代理模式中的虛函數
- 30. c#中虛函數的實際用法
考慮,在本例中,如果'Base'從另一個聲明最初的基礎'f'方法的類繼承。 –