2013-06-25 95 views
-2

是一個C++代碼:解釋錯誤下面

#include<iostream> 
using namespace std; 
class Base { 
    public: 
      virtual int f() const { cout << "Base::f()\n"; } 
      virtual void f(string) const {} 
      virtual void g() const {} 
}; 

class Derived4 : public Base { 
    public: 
      int f(int) const { cout << "Derived4::f()\n"; } 
}; 
int main() { 
    string s ("hello"); 
    Derived4 d4; 
    Base *br = &d4; //line 5 
    //br->f(1);//line 6 
    br->f();//line 7 
    br->f(s);//line 8 
} 

代碼工作正常,但第6行是一個錯誤。代碼調用f()的基本版本。我也讀過,如果你重新定義派生類中的函數,該函數的所有基類def全部隱藏?我錯了嗎?

+4

首先包括

+0

解釋_which_error?編譯器告訴你什麼?哪一行是第6行?乍一看,我看到五個錯誤。 –

+0

@MooingDuck你能說出這五個錯誤嗎?請 – akash

回答

2

有一些編譯錯誤。把它放在一邊 -

多態性是一個運行時的概念。所以,函數調用調度機制在運行時發生。你應該在基類和派生類中有相同的成員函數簽名才能工作。

br->f(1);//line 6 

在編譯時,編譯器將嘗試匹配與Base可用的成員函數的簽名。在這種情況下,f(string)接受字符串類型,因此錯誤。

我也讀過,如果你重新定義派生類中的函數, 該func的所有基類def全部隱藏?

這是一個不同的場景。

struct foo{ 
    fooBar(int i); 
}; 

struct bar:foo{ 
    fooBar(std::string); 
}; 

void test() 
{ 
    bar obj; 
    obj.fooBar(11); // bar class hides the member function foo::fooBar(int) 
} 
+0

的作用,這意味着,只有那些基礎和派生的函數(具有相同的arg和返回類型)才能發生後期綁定。 – akash

+0

@MooingDuck是的,我同意。你能告訴我我的答案的哪一部分表明了它的可能性嗎?我會盡力在下次編輯時更加準確。 – Mahesh

+0

@Mahesh:你應該已經指出obj.fooBar(11)不會編譯,因爲簽名是隱藏的。 –