簡體   English   中英

運行時綁定和虛擬繼承

[英]runtime binding and virtual inheritence

class Base {
  public:
  virtual int f() const {
       cout << "Base::f()\n";
       return 1;
}
 virtual void f(string) const {}
 virtual void g() const {}
};

class Derived4 : public Base {
  public:
       int f(int) const {
         cout << "Derived4::f()\n";
         return 4;
    }
};

int main()
{
    string s("hello");

    Derived4 d4;
    Base& br = d4; // Upcast
    // br.f(1); // Derived version unavailable
    br.f(); // why does it compile and run?
    br.f(s);// why does it compile and run?
}

在派生中:重載base ..的f() ,因此應隱藏所有基本f()版本。
現在,對於br.f()br.f(s) :由於運行時綁定,應調用f()f(s)的derived,但應將其隱藏,而代碼仍將編譯並執行int Base: :f()和無效Base :: f(string)。

Q1:我想念什么?
問題2: br.f(1)無法編譯,因為在編譯期間執行了類型檢查,並且Base中不存在int f(int) 我對么?

基類從不知道派生類中新添加的成員,它僅具有有關聲明自身的成員的信息。
因此,當將派生類實例d4分配給基類引用br ,新添加的方法int f(int) constbr隱藏。 這就是下面代碼的編譯錯誤的原因

// br.f(1); // Derived version unavailable

如下兩行編譯成功

br.f();
br.f(s);

欲了解更多信息:

class Base {
  public:
  virtual int f() const {
       cout << "Base::f()\n";
       return 1;
}
 virtual void f(string) const {}
 virtual void g() const {}
};

class Derived4 : public Base {
  public:
       int f(int) const {
         cout << "Derived4::f()\n";
         return 4;
    }
    void g() const {
         cout<< "Derived4::g()" << endl;
    }
};

int main()
{
    string s("hello");

    Derived4 d4;
    Base& br = d4; // Upcast
    // br.f(1); // Derived version unavailable
    br.f(); // No Compilation error
    br.f(s);// No Compilation error

    d4.f();  // Compilation error
    d4.f(s); // Compilation error
    d4.f(1); // No Compilation error
    d4.g();  // No Compilation error
    br.g();  // Will print - "Derived4::g()"
}

希望能幫助到你!

int Derived4::f(int)函數對基類隱藏函數,但不覆蓋它們。 為此,它應該具有完全相同的簽名。

在函數重寫的情況下,您可以在基類引用上調用該函數,並查看正在調用的派生類函數。

暫無
暫無

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

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