2010-11-12 161 views
1

可能重複:
C++ : implications of making a method virtual
Why is 'virtual' optional for overridden methods in derived classes?C++:派生類和虛擬方法

我不知道,什麼是在以下情況下記錄的行爲:

你有

class A 
{ 
virtual void A() 
{ 
    cout << "Virtual A"<<endl; 
} 
void test_A() 
{ 
    A(); 
} 
} 

class B: public A 
{ 
    void A() 
    { 
    cout << "Non-virtual A in derived class"<<endl; 
    } 

    void test_B() 
    { 
    A(); 
    } 
} 

A a; B b; 
a.test_A(); 
b.test_A(); 
b.test_B(); 

它應該按照C++標準做什麼,爲什麼? GCC像B :: A一樣也是虛擬的。

當你在派生類中通過非虛擬方法覆蓋虛擬方法時,通常會發生什麼?

+6

您的代碼[不應編譯](HTTP: //ideone.com/gI9bI)。 – 2010-11-12 11:16:11

+0

我認爲這也是答案在這裏:http://stackoverflow.com/questions/2963965/why-is-virtual-optional-for-overridden-methods-in-derived-classes – mkj 2010-11-12 11:18:10

回答

3

如果存在具有相同名稱和簽名的虛擬基類成員函數,則子類成員函數是隱式虛擬的。

+0

@Downvoter:請解釋一下,我想學習。 – 2010-11-12 11:18:18

+0

您需要更仔細地查看代碼。順便說一句,我沒有downlvoted。 – 2010-11-12 11:19:37

+1

代碼不起作用,我看到了,但我回答了最後一行中提出的問題。就此而言,我的回答是正確的。 – 2010-11-12 11:21:17

0

根據標準它應該是

 
A a; B b; 
a.test_A(); //"Virtual A" 
b.test_A(); //Non-virtual A in derived class 
b.test_B(); //Non-virtual A in derived class 
0

是形成不良的這種代碼。構造函數不能有返回類型(就像你爲'A'的構造函數所做的那樣)。另外一個構造函數不能是虛擬的。

修復了A的構造函數之後,B類是格式不正確的,因爲A的構造函數是私有的。

所以,這個代碼有很多問題(包括在類定義中缺少分號)。

2

代碼不應該編譯,因爲您不能使用類的名稱命名方法。但是對於我個人理解這是你真正的問題:

將使得虛擬的方法意味着,在所有派生類同樣的方法是虛擬的,即使virtual關鍵詞不存在?

答案是肯定的。一旦某個方法在類中被聲明爲虛擬的,那麼該方法的所有重寫將是虛擬的,並且關鍵字在派生類中是可選的(即使我建議僅爲了文檔目的而鍵入它)。請注意,對於一個方法在派生類是它必須具有相同的名稱和簽名的覆蓋,只有電位差是一個協變返回類型:

struct A {}; 
struct B : A {}; 
struct base { 
    virtual A* foo(); 
    virtual A* bar(); 
}; 
struct derived : base { 
    virtual B* foo(); // override, covariant return type 
    virtual int bar(); // not override, return type is not covariant 
    virtual A* bar(int); // not override, different argument list 
}; 
+0

是的:我想是的。問題的最後部分正是如此。 +1 – Chubsdad 2010-11-12 11:33:29