當一個基類中具有相同的函數名,並且每個函數的代碼都不相同時,是否需要將我的函數設置爲虛擬,還是僅僅是更好的編程的一部分?虛擬成員函數的必要性
1
A
回答
3
根本沒有必要使方法變爲虛擬。但是,如果您希望通過「後期綁定」來調用它,那麼它應該是虛擬的,即,如果給定基本指針,您希望調用派生方法。
如果您不希望發生這種情況,通常是因爲這些方法不相關,在這種情況下,您最好爲派生類中的方法指定一個不同的名稱。
0
虛擬函數的調用在運行時動態調度。這是多態性的基礎。
在基類中聲明爲虛擬的函數在子類中將隱式地爲虛擬。
0
0
如果您希望使用派生類實例的基類指針,並且函數具有相同的簽名,那麼您可能需要使函數virtual
以及使類的析構函數爲virtual
。這樣,如果某人有父類指向派生類型的指針,並且他們想要調用該函數,那麼他們可能會想要執行子類的版本(如果它不同於父類的)。
class Parent
{
public:
virtual ~Parent() {}
virtual void doSomething()
{
std::cout << "Parent";
}
};
class Child : public Parent
{
public:
virtual ~Child() {}
virtual void doSomething()
{
std::cout << "Child";
}
};
int main()
{
Parent *p = new Child();
p->doSomething(); // prints "Child" because of dynamic dispatch
}
0
class A {
public:
void Foo() {}
virtual void Bar() {}
};
class B : public A {
public:
void Foo() {}
virtual void Bar() {}
};
int main() {
A *a = new A;
B *b = new B;
A *c = b;
a->Foo(); // calls A::Foo on a
b->Foo(); // calls B::Foo on b
c->Foo(); // calls A::Foo on b
a->Bar(); // calls A::Foo on a
b->bar(); // calls B::Foo on b
c->bar(); // calls B::Foo on b
delete a;
delete b;
}
相關問題
- 1. 繼承和虛擬成員函數
- 2. 多態性/繼承問題與虛擬類的成員函數
- 3. C++從父虛擬成員調用子虛擬成員
- 4. 具有相同名稱的虛擬成員函數的繼承
- 5. 包含虛擬成員函數的類的大小
- 6. 虛擬非方法成員
- 7. 語法虛擬成員
- 8. 演員派生虛擬覆蓋基地純虛擬成員
- 9. 指向虛擬成員函數的指針是否可比?
- 10. C++成員函數的虛擬覆蓋和過載,同時
- 11. 構造函數中的虛擬成員調用
- 12. 默認情況下是虛擬的成員函數嗎?
- 13. 虛擬成員函數的打印地址
- 14. 當模板類的虛擬成員函數實例化了嗎?
- 15. 虛擬基類數據成員
- 16. 向屬性賦值時在構造函數中調用虛擬成員
- 17. 如何在C++中正確使用虛擬成員函數
- 18. 編寫非虛擬條件成員函數是否安全?
- 19. 虛擬析構函數 - 有需要時
- 20. 嘲笑Moq中的虛擬成員
- 21. 虛繼承和函數成員
- 22. d成員函數屬性
- 23. 虛擬函數C#
- 24. 虛擬函數C++
- 25. C#中虛擬基類方法/成員的屬性繼承
- 26. 空的構造函數的必要性
- 27. C++繼承:虛擬成員需要重新聲明?
- 28. 需要虛擬模板成員解決方法
- 29. C++:重寫純虛擬成員變量?
- 30. 虛擬繼承成員查詢
你的函數是否也有相同的簽名? – EnabrenTane 2010-12-19 19:59:50
也許吧。它可能不應該是虛擬的。無法從您的問題中獲知。 Google'多態性'。 – 2010-12-19 20:03:52