[英]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()不公開。
幾件事:
foo()
而不是foo(void)
...后者是不必要的,而不是慣用的C ++(它是類C語法)。 a* b_ptr = new b;
寫class
a* b_ptr = new b;
,因為已經聲明了一個類型。 return 0
)。 b_ptr
。 寫std::auto_ptr<a> b_ptr(new b);
會更好std::auto_ptr<a> b_ptr(new b);
。 b_ptr
的編譯時類型(聲明的類型)是a*
而它的運行時類型(實例化/分配類型)是b*
。 編譯器(和類型系統)只知道編譯時類型,因此基於編譯時類型執行對訪問權限的檢查...因此b_ptr->foo()
。 b*
類型或使a::foo
public以您希望的方式使用它。 做那個
class a
{
public:
virtual void foo(void);
};
您無法覆蓋私有函數。
雖然我不確定你是怎么設法調用b_ptr->foo()
因為a::foo
是私有的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.