重新定義和使用虛擬功能有什麼區別?他們不是有同樣的目的嗎?在這兩種情況下,您允許派生類的對象在相同的名稱下調用它們自己的函數版本..所以區別在哪裏?使用虛擬功能和重新定義之間的區別
1
A
回答
2
TL; DR
利用在C++多態性的唯一方法是通過虛函數和指針(和參考文獻)。 virtual關鍵字將告訴編譯器在處理指向具有子類的動態類型的基類的指針時決定調用何種版本的虛函數時,分配一個虛函數表。
如何在C多態性工作++
讓我們舉一個簡單的例子:
class A { public: virtual void eat() { std::cout << "Class A" << std::endl; }
class B : public A {};
class C : public B { virtual void eat() { std::cout << "Class C" << std::endl; }
注:虛擬關鍵字可以在第一函數/方法定義之後被省略。
以下:
A a; B b; C c;
A* ptrA = &a; A* ptrB = &b; A* ptrC = &c;
ptrA->eat();
ptrB->eat();
ptrC->eat();
會打印:
Class A
Class A
Class C
如果我們就不會宣佈功能eat
虛擬,輸出會被簡單:
Class A
Class A
Class A
3
區別在於何時有基準或指向基類的指針。對虛函數的調用將調用派生最多的版本,而對普通函數的調用將調用基類版本。
如果您直接使用變量或引用或指向最派生類的指針,則沒有實際區別。
4
一個例子最好說它:
#include <iostream>
using namespace std;
class A {
public:
virtual void f1() { cout << "Class A" << endl; }
void f2() { cout << "Class A" << endl; }
virtual ~A(){}
};
class B : public A {
public:
virtual void f1() { cout << "Class B" << endl; }
void f2() { cout << "Class B" << endl; }
virtual ~B(){}
};
int main()
{
A *a = new B;
a->f1();
a->f2();
}
...
$ ./override
Class B
Class A
你可以看到,當我們引用B的情況下,f1()
還叫B
的版本,但f2()
電話A
's。
當你聲明一個虛函數時,你說當我們調用它時,我們應該使用vtable來查找要調用的函數的正確版本,所以你將永遠得到該函數的最衍生版本,即使你將它作爲祖先類型引用。如果沒有虛擬,它將簡單地使用您引用它的類型中的定義。
相關問題
- 1. 虛擬功能與純虛擬功能的區別?
- 2. 兒童班的虛擬和非虛擬功能的區別
- 3. 虛擬,覆蓋,新和密封覆蓋之間的區別
- 4. 覆蓋非虛擬功能和虛擬功能有什麼區別?
- 5. 在虛擬機上使用RStudio和在RServer上使用Rstudio之間的區別
- 6. C++虛擬功能重寫和重載
- 7. 虛擬化中機器映像和實例之間的區別?
- 8. 物理和虛擬內存visual C++之間的區別?
- 9. 功能類型之間的區別
- 10. 功能參數之間的區別
- 11. 哪裏可以定義虛擬功能?
- 12. Jest Mock功能和Sinon間諜之間的區別是什麼
- 13. 虛擬功能
- 14. mod_rewrite重定向之間的區別?
- 15. 綁定和綁定之間的區別
- 16. ASP和C#之間的語義區別?
- 17. XMLReader.Create()和新的XMLTextReader()之間的區別
- 18. 檢測刷新和重新加載之間的區別
- 19. 使用@OneToMany和@ManyToMany之間的區別
- 20. 使用Trace和TraceSource之間的區別
- 21. SecKeychainAddGenericPassword中的serviceName和accountName之間的功能區別
- 22. 多態性誤解/重新定義了虛擬功能不工作
- 23. 用戶控件和自定義控件庫之間的區別
- 24. 組件和自定義用戶控件之間的區別
- 25. 節流和去除功能之間的區別
- 26. 帖子鏈接和鏈接功能之間的區別
- 27. Ruby on Rails集成和功能測試之間的區別
- 28. 單個虛擬桌面如何跟蹤新的虛擬功能?
- 29. 「使用」和將參數傳遞給控制器功能之間的區別
- 30. window.scrollbar和特定frame.scrollbar之間的區別
感謝這個明確的例子! – user1824518 2013-03-20 04:02:27