2013-11-23 76 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

相关问题