簡體   English   中英

虛函數

[英]Virtual function

class a
{
 virtual void foo(void) ;
};

class b : public  a
{
public:
 virtual void foo(void)
  {
  cout<< "class b";
  }
};

int main ( ) 
{
class a *b_ptr = new b ;
b_ptr->foo();
}

請指導我為什么b_ptr-> foo()不會調用類b的foo()函數?

在編寫代碼時,由於訪問控制違規,它將無法編譯。 由於b_ptr實際上是a *類型而a::foo是private,因此編譯器不允許這樣做。

但是讓a::foo公開,這將正確調用b::foo

還有一個問題是你沒有定義a::foo所以你的程序不會鏈接。 您需要定義它或使其成為純虛擬(即virtual void foo(void) = 0; )。

因為a:foo()不公開。

幾件事:

  1. foo()而不是foo(void) ...后者是不必要的,而不是慣用的C ++(它是類C語法)。
  2. 不要在a* b_ptr = new b;class a* b_ptr = new b; ,因為已經聲明了一個類型。
  3. 您應該從不返回void的函數返回(添加return 0 )。
  4. 你的代碼永遠不會釋放b_ptr std::auto_ptr<a> b_ptr(new b);會更好std::auto_ptr<a> b_ptr(new b);
  5. b_ptr的編譯時類型(聲明的類型)是a*而它的運行時類型(實例化/分配類型)是b* 編譯器(和類型系統)只知道編譯時類型,因此基於編譯時類型執行對訪問權限的檢查...因此b_ptr->foo()
  6. 使用聲明的b*類型或使a::foo public以您希望的方式使用它。

做那個

class a
{
public:
    virtual void foo(void);
};

您無法覆蓋私有函數。 雖然我不確定你是怎么設法調用b_ptr->foo()因為a::foo是私有的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM