2013-11-23 84 views
3

假設我們有一個來自抽象基類的派生類。指向抽象基類的指針在main中聲明並通過「new」分配給派生類。如何從指向基類的指針(而不是派生類的對象)訪問派生類的成員函數?多態性:你如何訪問派生類成員函數?

例子:

#include <iostream> 
using namespace std; 

class clsStudent 
{ 
public: 
    virtual void display() = 0;// {cout<<"Student\n";} 
}; 

class clsInternational : public clsStudent 
{ 
public: 
    void display(){cout<<"International\n";} 
    void passportNo(){cout<<"Pass\n";} 
}; 

class local : public clsStudent 
{ 
public: 
    void display(){cout<<"International\n";} 
    void icNo(){cout<<"IC\n";} 
}; 


int main() 
{ 
    clsStudent * s = new clsInternational; 
    clsStudent * s2 = new local; 

    s->display(); 
    s->passportNo(); //This won't work 

    return 0; 
} 
+2

這違背多態性的整個想法。如果要訪問派生類函數,則必須將指針轉換爲派生類型。 –

+0

函數'passNo()'沒有在'clsInternational','local'和'clsStudent'類中定義。這是一個錯字嗎?如果是這樣,它應該是什麼? – Oswald

+0

@Oswald - 關於它應該是s-> passportNo() – user3025784

回答

7

厚臉皮回答:不。我的意思是,如果你真的需要,你的技術問題的答案是C++中的dynamic_cast操作,以便進行「downcast」(從基類轉換爲派生類)。

但是回過頭來看,這是一個虛擬函數的合理用例。問問自己,我想訪問的常見含義是什麼?

在這種情況下,我們希望所有學生都有一個識別號碼。

工作的源代碼:http://ideone.com/5E9d5I

class clsStudent 
{ 
public: 
    virtual void display() = 0;// {cout<<"Student\n";} 
    virtual void identifyingNumber() = 0; 
}; 

class clsInternational : public clsStudent 
{ 
public: 
    void display(){cout<<"International\n";} 
    void identifyingNumber(){cout<<"Pass\n";} 
}; 

class local : public clsStudent 
{ 
public: 
    void display(){cout<<"Local\n";} 
    void identifyingNumber(){cout<<"IC\n";} 
}; 


int main() 
{ 
    clsStudent * s = new clsInternational; 
    clsStudent * s2 = new local; 

    s->display(); 
    s->identifyingNumber(); 

    s2->display(); 
    s2->identifyingNumber(); 

    return 0; 
} 
+0

但理論上,不同的派生類可以有不同的成員變量,因此有不同的方法來操作它們。如果clsInternational和Local都有非常不同的變量,而且沒有共同點?我們如何通過他們自己的方法從基類訪問它們? – user3025784

+0

如果您確實需要訪問派生類型,則可以嘗試以下操作: 'clsInternational * internationalS = dynamic_cast (s);' 然後'if(internationalS){/ *調用派生類函數*/}' – NicholasM

相關問題