C++ 多态性:如何访问派生类成员函数?

C++ 多态性:如何访问派生类成员函数?,c++,oop,polymorphism,C++,Oop,Polymorphism,假设我们有一个来自抽象基类的派生类。指向抽象基类的指针在main中声明,并通过“new”分配给派生类。如何从指向基类的指针(而不是从派生类的对象)访问派生类的成员函数 例如: #include <iostream> using namespace std; class clsStudent { public: virtual void display() = 0;// {cout<<"Student\n";} }; class clsInternational

假设我们有一个来自抽象基类的派生类。指向抽象基类的指针在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;
}
#包括
使用名称空间std;
班级学生
{
公众:

虚空DePosiy()= 0;/{Couth

不厚颜无耻的回答:不,我是说,如果你真的需要,你的技术问题的答案是C++中的<代码>动态Clasks> /Clult>操作,以便进行“下拉”(从基到派生类的转换)。 但退一步说,这是一个合理的虚拟函数用例。问问自己,我想要访问的常见含义是什么

在这种情况下,我们希望所有学生都有一个识别号

工作源代码:

class-clsStudent
{
公众:

virtual void display()=0;//{coutt这与多态性的整个概念背道而驰。如果要访问派生类函数,必须将指针强制转换为派生类型。函数
passNo()
未在任何类
clsInternational
local
clsStudent
中定义。这是打字错误吗?如果是,应该是什么?@Oswald-很抱歉,它应该是s->passportNo()但是从理论上讲,不同的派生类可以有不同的成员变量,因此可以使用不同的方法来操作它们。如果clsInternational和local都有非常不同的变量,但是没有共同点呢?我们如何从基类通过它们自己的方法来访问它们?如果确实需要访问派生类型,那么您可以尝试以下操作:
clsInternational*international=dynamic_cast;
if(internationalS){/*调用派生类函数*/}
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;
}