簡體   English   中英

在C ++中,如果成員函數是虛擬的,何時可以使用靜態綁定?

[英]In C++ if a member function is virtual when can static binding be used?

在C ++中什么時候虛函數可以使用靜態綁定? 如果通過指針訪問它,直接訪問,或從不?

通過指針或引用調用虛方法時,將使用動態綁定。 在任何其他時間,使用編譯時綁定。 例如:

class C;

void Foo(C* a, C& b, C c) {
  a->foo();  // dynamic
  b.foo();  // dynamic
  c.foo();  // static (compile-time)
}

如果要調用函數的基類版本,可以通過顯式命名基類來實現:

class Base
{
public:
  virtual ~Base() {}
  virtual void DoIt() { printf("In Base::DoIt()\n"); }
};

class Derived : public Base
{
public:
  virtual void DoIt() { printf("In Derived::DoIt()\n"); }
};

Base *basePtr = new Derived;
basePtr->DoIt();  // Calls Derived::DoIt() through virtual function call
basePtr->Base::DoIt();  // Explicitly calls Base::DoIt() using normal function call
delete basePtr;

靜態綁定只能在對象的類型在編譯時完全明確時才能完成。 我只能想到抽象對象的類型是明確的四個地方:在構造函數中,在析構函數中,當在本地聲明時,在與動態分配相同的范圍內。 我不太清楚這個標准,所以我不能說它對這四種可能性的說法(我說前兩個是靜態綁定的,第三個可能是靜態綁定而最后一個不是;雖然它可能說它是未定義的或實施依賴)。 除了這些點之外,通過基類指針訪問的對象可能指向派生類,而當前的翻譯單元無法知道,因此靜態綁定是不可能的。 可以使用指向一個實例中的基類的指針和指向另一個實例中的派生類的指針來調用該函數!

暫無
暫無

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

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