2010-12-19 76 views
1

當一個基類中具有相同的函數名,並且每個函數的代碼都不相同時,是否需要將我的函數設置爲虛擬,還是僅僅是更好的編程的一部分?虛擬成員函數的必要性

+0

你的函數是否也有相同的簽名? – EnabrenTane 2010-12-19 19:59:50

+0

也許吧。它可能不應該是虛擬的。無法從您的問題中獲知。 Google'多態性'。 – 2010-12-19 20:03:52

回答

3

根本沒有必要使方法變爲虛擬。但是,如果您希望通過「後期綁定」來調用它,那麼它應該是虛擬的,即,如果給定基本指針,您希望調用派生方法。

如果您不希望發生這種情況,通常是因爲這些方法不相關,在這種情況下,您最好爲派生類中的方法指定一個不同的名稱。

0

虛擬函數的調用在運行時動態調度。這是多態性的基礎。

在基類中聲明爲虛擬的函數在子類中將隱式地爲虛擬。

0

不,沒有必要這樣做。

事實上,何時申報虛擬和何時不是有效的程序設計本身的一部分。

查看here瞭解關於虛擬和純虛擬功能的更多信息。

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; 
} 

請參閱C++ FAQ § Inheritance — virtual functions