第一基類的接口如何恢復通過crosscast
class Io_obj
{
public:
virtual Io_obj* clone() const=0;
virtual ~Io_obj(){}
};
首先派生類
template<typename T>
class Io : public Io_obj,T
{
public:
Io(){}
Io(string& s){cout << s << '\n';}
Io* clone() const override {return new Io{*this};}
static Io* new_io(string& s){return new Io{s};}
};
第二基類
class Shape
{
public:
virtual void draw() const=0;
virtual ~Shape(){}
};
第二派生類
class Circle : public Shape
{
public:
Circle(){}
Circle(string& s){cout << s << '\n';}
void draw() const override{cout << "draw circle\n";}
};
class Triangle : public Shape
{
public:
Triangle(){}
Triangle(string& s){cout << s << '\n';}
void draw() const override {cout << "draw triangle";}
};
個
主要功能
動態轉換失敗。看起來由unique_ptr<Io_obj> my_obj{get_obj(x)}
創建的對象的類型爲Io_obj
,它沒有成員函數draw()
。如何使它工作?
代碼從Bjarne的Stroustrup的:C++編程語言Ch22.2.4
'dynamic_cast <>''將'Io'轉換爲'T'。如果我理解正確,在這個過程中'Circle'成爲'Io'的公共基礎。因此'Io'繼承'Circle'的成員函數'draw()'。由於在'Circle'的公共基礎'Shape'中'draw()'被聲明爲'virtual','sp-> draw()'的調用最終可以被編譯器處理。 –
@MiloLu是的,就是這樣。雖然它沒有被編譯器處理。通常在運行時處理虛擬函數(我不考慮任何優化)以確定對象的實際類型(以及應該調用哪個虛擬函數)。 –
我嘗試了一種不同的方法:將'T'作爲成員而不是公共基地,然後再次發佈問題。也許你可以有一些建議? http://stackoverflow.com/questions/33614524/how-to-cast-an-objx-to-an-x?noredirect=1#comment55004110_33614524 –