我有以下代表DNS的类层次结构:
class CZone {
string m_Name;
vector<RecordSurrogate> m_Records;
public:
CZone ( string name ) : m_Name(name) {};
bool Add ( const CRecord & );
bool Del ( CRecord & );
vector<CRecord> Search ( const string & ) const;
void Print ( ostream & os ) const;
friend ostream & operator<< ( ostream & os, const CZone & );
};
使用 Add()和 Del()方法,我想检查 m_Records 中是否存在具有给定名称的记录。我不能在这里使用 typeid ,但我可以通过 Type()返回的值识别不同的记录。
我写了bool CZone::recEqual(const CRecord &lhs, const CRecord &rhs) const
medhod但是仍然坚持投诉
静态广播从'const CRecord'到'const CRecA'没有匹配的转换
这个结构:
bool CRecA::isEqual( const CRecord & rhs ) const {
return ( m_Name == rhs.m_Name && m_IP == static_cast<const CRecA>(rhs) . m_IP );
}
基类:
class CRecord {
protected:
string m_Name;
public:
CRecord ( void ) = default;
CRecord ( string & name ) : m_Name(name) {}
string Name ( void ) const { return m_Name; }
virtual string Type ( void ) const = 0;
virtual ~CRecord ( void ) {};
};
派生类:
class CRecA : public CRecord {
CIPv4 m_IP;
public:
CRecA ( void ) = default;
string Type ( void ) const { return "A"; }
ostream & operator << ( ostream & os ) const;
CRecord * copy ( void ) const;
};
class CRecMX : public CRecord {
string m_Server;
int m_Prio;
public:
CRecMX ( void ) : m_Prio(0) {};
CRecMX ( string name, string server, int prio ) :
CRecord::CRecord(name), m_Server(server), m_Prio(prio) {}
string Type ( void ) const { return "MX"; }
ostream & operator << ( ostream & os ) const;
CRecord * copy ( void ) const;
};
代理类:
class RecordSurrogate {
public:
RecordSurrogate ( void );
RecordSurrogate ( const CRecord & );
~RecordSurrogate ( void );
RecordSurrogate ( const RecordSurrogate & );
RecordSurrogate & operator= ( const RecordSurrogate & );
string Name ( void ) const;
string Type ( void ) const;
private:
CRecord * rp;
};
答案 0 :(得分:1)
评论中的其他代码显示错误:
bool CRecA::isEqual(const CRecord& rhs) const
{
return m_Name == rhs.m_Name && m_IP == static_cast<const CRecA>(rhs).m_IP;
}
您尝试将CRecord const&
投射到CRecA const
,这是不正确的。您需要将其转换为CRecA const&
。
原因很简单:您希望解释 原始对象作为其派生类 - 而不是将CRecord
对象转换为{ {1}}对象。