如何強制基類方法不被派生類覆蓋?如何防止在派生類中重寫方法?
回答
如果您使方法非虛擬,派生類不能重寫該方法。然而,一個類不能從一個基類中覆蓋一個方法,並且也會阻止其他派生類覆蓋相同的方法。一旦該方法是虛擬的,它就保持虛擬。
+1:然而,這個部分對我來說非常重要。 – imallett 2013-05-26 21:37:43
使用C++ 11,您可以使用final
說明符來避免在派生類中覆蓋方法 –
tharinduwijewardane
2016-02-10 07:43:32
好吧,如果你想保持公開,不要聲明它是虛擬的。
編輯:Srikanth評論想知道重寫派生類中的私有成員函數。
class A
{
public:
virtual ~A(){};
void test()
{
foo();
};
private:
virtual void foo()
{
std::cout << "A";
};
};
class B : public A
{
public:
virtual void foo()
{
std::cout << "B";
};
};
void test()
{
B b;
A& a = b;
a.test(); // this calls the derived B::foo()
return 0;
}`
派生類仍然可以覆蓋虛擬專用成員函數。 – 2010-12-16 22:01:49
我已編輯,thanx爲更正。 – 2010-12-16 22:21:18
但我們如何重寫一個私人方法,而不使派生的朋友或減少訪問說明 – sriks 2010-12-18 23:28:43
不要讓它變成虛擬的。
這不會阻止派生自你的類並隱藏該函數(通過提供另一個成員函數具有相同的名稱)。然而,如果你的類不是被派生出來的(沒有虛擬析構函數,沒有虛擬成員函數),那應該不是問題。
以及據我所知,你不能在C++上做到這一點,你可以嘗試將其聲明爲私有。 。發現這個鏈接的更多信息http://en.allexperts.com/q/C-1040/prevent-overriding-functions-derived.htm
派生類仍然可以覆蓋虛擬私有成員函數。 – 2010-12-16 22:02:09
簡短的回答:沒有必要這樣做。很長的答案,你可以做some twists,但它值得嗎?
如果您能夠使用C++ 11中的final
說明符,則可以防止派生類重寫該方法。 (Microsoft編譯器似乎支持類似sealed
類似的語義。)
下面是一個例子:
#include <iostream>
struct base {
// To derived class' developers: Thou shalt not override this method
virtual void work() final {
pre_work();
do_work();
post_work();
}
virtual void pre_work() {};
virtual void do_work() = 0;
virtual void post_work() {};
};
struct derived : public base {
// this should trigger an error:
void work() {
std::cout << "doing derived work\n";
}
void do_work() {
std::cout << "doing something really very important\n";
}
};
int main() {
derived d;
d.work();
base& b = d;
b.work();
}
這裏就是我得到的,當我嘗試編譯:
$ g++ test.cc -std=c++11
test.cc:17:14: error: virtual function ‘virtual void derived::work()’
test.cc:5:22: error: overriding final function ‘virtual void base::work()’
- 1. 如何防止Nhibernate獲取派生類?
- 2. 在C#中如何調用派生類實例中已在派生類中重寫的基類方法
- 3. 簡單的「防止派生類」,在C++
- 4. 調用重寫的方法在派生類的基類
- 5. C#繼承防止基類的方法調用派生類的方法
- 6. 模板方法模式 - 防止派生類中的直接方法調用
- 7. C++ - 從方法基類中調用派生類中的重寫方法
- 8. 如果派生類重寫方法,爲什麼調用基類方法?
- 9. 如何:派生類中派生類的派生類與特定於派生類的方法
- 10. 重寫基類的常量方法從派生類
- 11. 編寫派生類的通用方法
- 12. 重寫虛擬方法時無法返回派生類指針
- 13. 防止派生類被破壞
- 14. 如何防止從C++ 03中的類型派生?
- 15. 防止重寫CSS類
- 16. 如何防止.htaccess重寫?
- 17. Java:在不同返回類型的派生類中重寫方法?
- 18. 在C++/CLI中通過包裝器(派生託管類)調用派生本機類的重寫方法
- 19. Java繼承 - 在派生對象中使用基本變量時,派生類重寫基類方法
- 20. IOS xamarin派生類中重寫事件
- 21. Python派生類在派生類上自動運行類方法
- 22. 哪個基類調用派生重寫方法?
- 23. 如何用裝飾方法派生類?
- 24. 如何爲派生類對象編寫驗證方法
- 25. java如何防止類被派生超過兩個級別?
- 26. 如何防止在拒絕後重寫
- 27. 如何從派生類方法調用基類方法?
- 28. 派生類共享方法
- 29. 防止在C#中的單個方法的重寫
- 30. 你如何重寫的onClick在Android的ImageButton派生類
不要它在基類中是虛擬的?然後它不能被覆蓋,只有重載。如果這是個問題,那麼就沒有直接相當於Java的「最終」方法。 – 2010-12-16 21:51:08
因此,如果不使用虛擬關鍵字,我們無法制作它,那麼它們是如何在JAVA中執行的,然後在Java中執行 – sriks 2010-12-17 13:15:42
,標記了一個'final'方法禁止實現該方法的子類,並且編譯器和/或字節碼驗證程序將強制執行此操作。在C++中,沒有辦法禁止它,只是通過定義「覆蓋」,只有虛擬函數才能被「覆蓋」。 – 2010-12-17 14:33:37