#include<iostream>
class base{
public:
virtual void run(){};
protected:
~base(){std::cout<<"destructor for base"<<std::endl;};
};
class derived : public base {
public:
void run(){};
~derived(){std::cout<<"destructor for derived"<<std::endl;};
};
void get_type (std::shared_ptr<base> b){
b.reset (new derived);
std::cout<<"end of get_type"<<std::endl;
}
int main(){
std::shared_ptr<base> b;
get_type (b) ;
std::cout<<"out of get_type"<<std::endl;
b->run();
}
它編譯好,但我得到了分段錯誤。我看着發生了什麼,輸出是get_type 析構函數派生 析構基地 的對C++多態性使用的質疑
結束了get_type 分割故障:11
它會進入get_type並分配其類型。但是,除了這個函數範圍外,它會自動再次破壞類型。然後,因爲它找不到b-> run(),所以它給出了seg錯誤。任何人都知道如何使它工作?我找不到類似的問題。對不起,如果可能重複。
你忘了做'base ::〜base()'virtual – 2014-11-04 19:24:38
編譯所有的警告信息,你應該收到一個關於@AntonSavin聲明的警告。 – 2014-11-04 19:26:23
這並沒有解決它。我也使用-g -Wall -std = C++ 11 -pedantic -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat = 2 -Winit-self -Wmissing-declaration- Wmissing-include-dirs -Wold-style--Woverloaded-virtual -Wredundant-decls -Wshadow -Wign-conversion -Wsign-promo -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror -Wno-unused for the flag 。沒有警告信息被打印出來。 – user3089810 2014-11-04 19:33:49