[英]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) const
對br
隱藏。 這就是下面代碼的編譯錯誤的原因
// 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.