爲什麼派生類必須將其方法聲明爲虛擬的,以便動態綁定工作,即使基類的方法被聲明爲虛擬的?C++中的動態綁定
3
A
回答
5
它不是必須的。如果某個方法在基類中聲明爲虛擬,則在派生類中重寫該方法時,重寫函數也會變爲虛擬,即使未使用關鍵字virtual
也是如此。
2
是嗎?下面的代碼產生期望的輸出B :: f1()(使用VS2008編譯):
class A
{
public:
virtual ~A(){}
virtual void f1()
{
std::cout<<"A::f1()\n";
}
virtual void f2()
{
std::cout<<"A::f2()\n";
}
};
class B : public A
{
public:
void f1()
{
std::cout<<"B::f1()\n";
}
void f2()
{
std::cout<<"B::f2()\n";
}
};
int main()
{
B b;
A* p = &b;
p->f1();
return 0;
}
+0
謝謝你的回答,幫了很大忙。 – user224579 2009-06-23 06:56:39
3
它沒有。
class Base
{
virtual void foo() {}
};
class Derived : public Base
{
void foo() {}
}
在此代碼
foo()
依然是虛擬的在Derived
類,即使它沒有被聲明爲這樣。
2
引述C++標準(10.3.2):
如果虛擬成員函數
vf
在類Base
和在類Derived
被聲明,直接或間接從Base
衍生,成員函數vf
具有與Base::vf
相同的名稱和相同的參數列表,則Derived::vf
也是虛擬的(不論它是否如此聲明),並且其優先於Base::vf
。
你可以總結一下:「一次虛擬,總是虛擬」。但是,仍然可以將virtual
修飾符添加到重寫成員函數中,以便向用戶明確該類是多態的。
0
一個不需要。 但我更喜歡在派生類中使用虛函數,因爲它會使讀取代碼時與這些函數關聯的動態綁定更加清晰。
相關問題
- 1. C中的動態綁定#
- 2. C++動態綁定
- 3. C++動態綁定問題
- 4. c + +動態綁定和java動態綁定有什麼區別?
- 5. 動態綁定與動態綁定之間有什麼區別Objective C C
- 6. CoffeeKup中的動態綁定
- 7. jsf中的動態綁定
- 8. XAMGrid中的動態綁定
- 9. CellEditingTemplate中的動態綁定
- 10. XAML中的動態綁定
- 11. 動態綁定
- 12. 動態綁定?
- 13. 動態綁定和靜態綁定
- 14. 靜態綁定與動態綁定
- 15. C#DataGridView綁定到動態數據
- 16. C++動態WX菜單綁定
- 17. 動態綁定MenuItems
- 18. Guice - 「動態」綁定?
- 19. 動態綁定RadGrid
- 20. 動態列綁定
- 21. 動態JavaFX綁定
- 22. WPF動態綁定
- 23. 動態綁定WPF
- 24. 動態綁定Ninject
- 25. 靜態和動態綁定
- 26. 函數在C++中的靜態綁定
- 27. 動態和靜態綁定在Java中
- 28. 設置的動態綁定?
- 29. asp.net的GridView動態綁定
- 30. 延遲綁定vs動態綁定
謝謝,我不知道。 – user224579 2009-06-23 06:54:42