當我應用指向乘法繼承對象的實例的指針時,dynamic_cast
運算符返回零(0)。我不明白爲什麼。動態轉換和多重繼承
層次結構:
class Field_Interface
{
public:
virtual const std::string get_field_name(void) const = 0; // Just to make the class abstract.
};
class Record_ID_Interface
{
public:
virtual bool has_valid_id(void) const = 0;
};
class Record_ID_As_Field
: public Field_Interface,
public Record_ID_Interface
{
// This class behaves as a Field and a Record_ID.
// ...
}
// A demonstration function
void Print_Field_Name(const Field_Interface * p_field)
{
if (p_field)
{
cout << p_field->get_field_name() << endl;
}
return;
}
// A main function for demonstration
int main(void)
{
Record_ID_As_Field * p_record_id = 0;
p_record_id = new Record_ID_As_Field;
if (p_record_id)
{
// (1) This is the trouble line
Print_Field_Name(dynamic_cast<Field_Interface *>(p_record_id));
}
return 0;
}
我想有Record_ID_As_Field
被作爲Field_Interface
治療,但也適合在需要Record_ID_Interface
。
爲什麼上面(1)中的dynamic_cast
返回0,我該如何解決這個問題?
我在Windows XP上使用Visual Studion 2008。
注意:爲了簡單起見,我在本例中使用基本指針。實際的代碼使用boost::shared_ptr
。
沒有理由測試'p_record_id'不爲空,'new'永遠不會返回null。 (我假設這是因爲它是一個片段,但要確保你的公共基類具有虛擬析構函數。) – GManNickG 2010-08-20 18:17:27
我一直認爲動態投射,如果對於向上投射......並且向下投射是隱式的...... – vrdhn 2010-08-20 18:18:43
沒有證據表明你已經實現抽象的方法。你是否? – 2010-08-20 18:21:02