我試圖實現一個簡單的文件系統。我有一個基類入口。我有兩個從名爲File和Directory的條目繼承的類。目錄包含一個Entry對象列表。我有一個稱爲changeDir的目錄和文件,但不是條目的方法。我希望我可以在Entry對象上調用這個方法,並且編譯器會根據Entry是Directory還是File來知道使用哪種方法。任何方式來完成這個?C++中的多態性。在基類上調用繼承的方法
class Entry{
public:
std::chrono::time_point<std::chrono::system_clock> dateCreated;
std::string fileName;
Entry(std::string name);
~Entry();
};
Directory* Directory::changeDir(Directory* dir, Directory* currentDir){
currentDir = dir;
return currentDir;
}
void File::changeDir(Directory* dir, Directory* currentDir){
std::cout<<"You cannot change directories into a file\n";
}
unordered_set<Entry*> s;
s.add(File);
s.add(Directory);
for each in s: each.changeDir(); //pseudo code
不幸的是,它告訴我一個changeDir()方法尚未被聲明爲Entry類。我通常會爲Entry類創建一個方法,但它說Directory不在此範圍內聲明(顯然,因爲Directory是Entry的派生類)。我覺得我已經在Python中做過這種類型的多態。在C++中沒有辦法做到嗎?謝謝。
編輯:Set將指針指向Entry對象,而不是實際的Entry對象。
編輯2:看來虛擬類是解決這個特定問題的方法。我相信更好,更強大的解決方案將是讓每個目錄包含一組文件和一組導演而不是一組導演。
如果你把'changeDir'放在基類中,你*可以*做到這一點,但是因爲它不涉及'File'爲什麼要這樣做?另外,如果沒有引用或指針,您將獲得[object slicing](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwinvqq60OPUAhXM54MKHedcAdQQFgg0MAI&url=https%3A %2F%2Fen.wikipedia.org%2Fwiki%2FObject_slicing&usg = AFQjCNHH_00F7lDRk2r0g2QEwWX0SJ9wg) – crashmstr
另外,如果'File'和'Directory'是類,則不能將*類添加到您的集合中。 – crashmstr
@crashmstr該方法有時會在File對象上調用,我需要一種方法來處理這種情況。我不能將方法放在基類中,因爲它返回Directory *並將Directory *作爲參數。編譯器狀態目錄未在該範圍內聲明。我不確定你的評論是什麼意思。你的意思是我的設置只能使用Entry對象嗎?不是目錄和文件技術上的入口對象? – user3736114