有一個Student抽象類,以及兩個派生類Grad和Undergrad;我想用幾種方式來多載操作者。
student.h
class Student {
protected:
string 名字。
int Stu_num;
public:
virtual void print()= 0;
bool operator==(const Student& x) const;
//構造器...。
}
class Grad_Student : public Student {
private:
string Lab;
public:
void print()。
bool operator==(const Grad_Student& x) const;
//建構式...。
}
class Undergrad_Student : public Student {
private:
string Major;
public:
void print()。
bool operator==(const Undergrad_Student& x) const;
//建構式...。
student.cpp
bool Student::operator==(const Student& x) const {
if (this->Name == x.Name && this-> Stu_num == x.Stu_num) {
if (typeid(*this) 。 name() != typeid(x).name() ) {
return false。
}
else if (! (strcmp(typeid(*this) . name(), "12Grad_Student")) {
return *dynamic_cast<const Grad_Student *> (this) == *dynamic_cast<const Grad_Student *>(&x)。
}
else {
return *dynamic_cast<const Undergrad_Student *> (this) == *dynamic_cast<const Undergrad_Student *> (&x)。
}
}
else {
return false;
}
}
bool Grad_Student::operator==(const Grad_Student& x) const {
return this->Lab == x.Lab;
}
bool Undergrad_Student::operator==(const Undergrad_Student& x) const {
return this-> Major==x.Major;
}
要在Student *students[300]中找到學生物件
這個操作==多載作業,沒有問題。
但我想用以下不同的方式實作多載。
我怎樣才能實作這個函式呢?
bool operator==(const Student& x, const Student& y)
{
//做比較...。
uj5u.com熱心網友回復:
雖然這看起來是可行的,但type_info::name()是
- 依賴實作,
- 不能保證在不同型別之間是唯一的,
- 不能保證是唯一的。
- 不能保證在同一程式的不同執行中是相同的。
盡管直接比較 type_infos 是可靠的,所以你可以做一些事情,比如 if (typeid(*this) == typeid(Grad_Student)) 并且它將按照預期作業。
然而,多型性已經存在,所以你不需要自己實作它,而且你可以通過調度到一個虛擬函式而不是列舉子類來避免很多麻煩(和開銷)。 像這樣:
class Student {
public:
bool equals(const Student& s) const
{
return Name == s.Name
&& Stu_num == s.Stu_num
&& typeid(*this) == typeid(s)
&& equals_internal(s)。
}
private:
virtual bool equals_internal(const Student& s) const= 0;
字串名稱。
int Stu_num;
};
bool operator==(const Student& lhs, const Student& rhs)
{
return lhs.equals(rhs)。
}
class Grad_Student : public Student {
private:
string Lab;
bool equals_internal(const Student& s) const override
{
return Lab == static_cast<const Grad_Student&> (s).Lab;
}
};
class Undergrad_Student : public Student {
private:
string Major;
bool equals_internal(const Student& s) const override
{
return Major == static_cast<const Undergrad_Student&> (s).Major。
}
};
注意,static_casts是安全的,因為Student已經建立了型別平等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/331113.html
標籤:
