[英]My 3rd stack is printing out in reverse order from my 1st and 2nd stack
[英]Calling a 3rd layer subclass using a 1st layer pointer
我建立了一個類層次結構,其中第一層超級類是職員。 在第二層中,我有2個子類,分別稱為管理員和學術人員。 (這兩層也是抽象類)。 學術人員還有2個僅用於教學和研究的子類。
在我的主要工作中,我試圖創建一個由10個職員指針組成的數組(5個管理員和5個學術指針),並使用這些指針操縱第三層子類。 切記第三層子類的行為在第一層或第二層中不存在。 因此,我必須使用類型轉換。 我可以分別更改第三層的行為,例如,
((ResearchStaff *)ptr[i])->setResearchHour(23);
但很快就會變得非常混亂。 我的問題是,如何在for或while循環中訪問我的第3層行為,而不必單獨設置它們。 這是與我合作的主要工具。 非常感謝!!
int main()
{
Staff *ptr[10];
for(int i=0;i<10;i++)
{
ptr[i] = new AdminStaff;
((AdminStaff *)ptr[i])->setAdmin(12);
i++;
ptr[i] = new TeachingStaff;
(( TeachingStaff*)ptr[i])->setTeaching(16);
}
}
兩件事情!
AdminStaff
或TeachingStaff
,不必強制轉換回base即可調用派生類方法。 所以代替
ptr[i] = new TeachingStaff;
(( TeachingStaff*)ptr[i])->setTeaching(16);
你可以這樣寫
TeachingStaff *ts = ptr[i] = new TeachingStaff;
ts->setTeaching(16);
最后,如果這些類沒有很多共同的屬性,則可以考慮將組成作為替代設計策略,而不是使用多重繼承。
您可以使用Visitor模式。
在您的Staff
類中添加一個名為accept
,如下所示:
class Staff
{
//Other staff stuff
public:
void accept(const Visitor& v) = 0;
}
將實現添加到葉類中...
class ResearchTeacher
{
//Other research teacher stuff...
public:
void accept(const Visitor& v) {
v.visit(*this);
}
}
然后定義一個訪問者,該訪問者知道如何處理每種類型:
class Visitor
{
public:
void visit(ResearchTeacher& teacher)
{
teacher.setResearch(16);
}
void visit(TeachingTeacher& teacher)
{
teacher.setTeaching(16);
}
void visit(AdminStaff& admin)
{
admin.setAdmin(12);
}
}
現在,調用代碼不必擔心:
int main()
{
Visitor v;
Staff *ptr[10];
for(int i=0;i<10;i++)
{
ptr[i] = new AdminStaff;
ptr[i]->accept(v);
i++;
ptr[i] = new TeachingStaff;
ptr[i]->accept(v);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.