[英]behavior of the compiler using classes
#include <list>
using std::list;
class foo { ...
class bar : public foo { ...
static void print_all(list<foo*> &L) { ...
list<foo*> LF;
list<bar*> LB;
...
print_all(LF); // works fine
print_all(LB); // static semantic error
我想我知道為什么編譯器將不允許第二個調用。 任何人都可以舉一個如果編譯器接受這種調用可能發生的壞事的例子嗎?
當然! 如果print_all這樣做怎么辦:
L.push_back(new Foo);
現在,您的Bar指針列表具有一個指向不是Bar的Foo對象的指針。 如果然后嘗試在Foo類中不存在的Bar中調用方法,則會遇到某種嚴重的運行時問題,因為該方法在Foo對象中不存在。
希望這可以幫助!
代碼中有兩種不同的情況,有不同的解釋。 第一個問題是,即使實例化類型相關,模板的不同實例化也不相關。 在這種特殊情況下,即使foo
是bar
的基礎, std::list<foo*>
與std::list<bar*>
也沒有關系。 這是語言設計的一部分,什么也做不了。
第二個問題(不是編譯器在抱怨的問題)是,通常,不能將derived
的容器作為引用用作base
的容器。 這就是@templatetypedef帶來的問題-但是,這又不是代碼中的問題,而是另一個示例:
void f( base** p );
int main() {
derived *d;
f( &d ); // error
}
在這種情況下,這個問題是,隨着@templatetypedef指出使用的指針/容器derived
代替指針/容器的base
在一個非const方式是容易出錯,因為你可以存儲非derived
類型在指針/容器上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.