我想在C++中理解這一點。 如果類A有一個非虛方法,並且擴展A的類B覆蓋該方法,我可以創建B的一個實例並以某種方式使用B中定義的方法? 有沒有必要重寫一個非虛方法?我可以使用覆蓋非虛方法的方法嗎?
回答
是否有必要重寫一個非虛方法?
你實際上並沒有覆蓋,但是這是行爲,即
B* b = new B();
A* a = new B();
b->method(); //Calls B's method
a->method(); // Calls A's method
因此,指針/引用類型決定調用的方法。
我可以創建一個B的實例,並以某種方式使用B中定義的方法嗎?
是的。指針/引用類型必須是B類型的(參見前面的例子)。
如果不申報method
是virtual
,你不能覆蓋它,但你可以隱藏它。
很好的答案,謝謝 – Eyal
一個「gotcha」是當'A'反過來是從一些基類(或實現一個接口)派生'virtual method()',在這種情況下'a->方法()'實際上會調用'B.method()'... – BadCash
@Chip你錯過了強調差異。這個答案只有BadCashs評論完成。 – ManuelSchneid3r
如果從A
B
繼承,並重新定義了A
定義的方法,那麼B
新實例將調用B
的版本。但是,如果該方法不是虛擬的,則不存在多態行爲,因此如果B
的實例被引用爲A
,則該方法將爲A
。例如:
struct A {
void foo() { std::cout << "A::foo" << std::endl; }
};
struct B : public A {
void foo() { std::cout << "B::foo" << std::endl; }
};
B b;
b.foo();
A *a = &b;
a->foo();
的代碼的輸出以上將是:
B::foo
A::foo
然而,如果foo
方法已經虛擬的,然後將B::foo
已打印的兩倍。
寫得很好! :) – niknak
如果函數不是virtual
那麼變量的類型決定了執行被分派太:
#include <iostream>
using namespace std;
struct A {
void f() { cout << "A" << endl; }
};
struct B : public A {
void f() { cout << "B" << endl; }
};
int main(int args, char** argv) {
B b;
A& a = b;
b.f();
a.f();
return 0;
}
- 沒有,沒有機制來覆蓋類A. 非虛擬方法
- 是的,則可以通過使用範圍解析運營商A使用從A類B中過載的非虛擬方法::方法名
- 1. 覆蓋非虛擬方法?
- 2. 如何覆蓋非虛擬方法?
- 3. 可以覆蓋類別方法嗎? IOS
- 4. 可以覆蓋jsp_service()方法嗎?
- 5. C++虛擬方法覆蓋
- 6. 使用虛擬覆蓋方法簽名
- 7. 我可以覆蓋doPost方法的servlet的方法,多次
- 8. C#中有什麼方法可以用擴展方法覆蓋類方法嗎?
- 9. 我可以防止繼承的虛擬方法在子類中被覆蓋嗎?
- 10. C++用純虛方法覆蓋純虛方法
- 11. 我可以用模塊覆蓋實例方法嗎?
- 12. 我可以避免在以下情況下覆蓋方法嗎?
- 13. 我可以手動覆蓋繼承的方法嗎?
- 14. 我可以檢測到方法已被覆蓋嗎?
- 15. 我可以在繼承中只覆蓋一種方法嗎?
- 16. 覆蓋Object的虛擬方法
- 17. 覆蓋合格的虛擬方法
- 18. 覆蓋C++的虛擬方法
- 19. 你可以調用在Haxe中被覆蓋的父方法嗎?
- 20. 用轉換方法覆蓋虛擬方法
- 21. 虛擬函數可以被非虛函數覆蓋嗎?
- 22. 覆蓋虛擬功能到非虛擬功能可以嗎?
- 23. Java方法覆蓋 - 在父級訪問方法 - 這可能嗎?
- 24. Java方法覆蓋 - 「方法不會覆蓋超級方法...」
- 25. 覆蓋方法
- 26. 覆蓋方法
- 27. 覆蓋方法
- 28. 覆蓋方法
- 29. 覆蓋'+'方法
- 30. 有什麼方法可以自動覆蓋NetBeans中的方法嗎?
你所描述的稱爲*隱藏*,而不是覆蓋。看看這裏,例如:http://stackoverflow.com/questions/2161462/c-inheritance-and-function-overriding – jrok