2013-11-23 4 views
3

Предположим, что у нас есть производный класс из абстрактного базового класса. Указатель на абстрактный базовый класс объявляется в основном и выделяется производному классу через «новый». Как вы получаете доступ к функциям-членам производного класса от указателя на базовый класс (а не от объекта производного класса)?Полиморфизм: как вы получаете доступ к функциям члена производного класса?

Пример:

#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

@ Освальд. Простите, что это должно было быть s-> passportNo() – user3025784

ответ

7

дерзкий ответ: нет. Я имею в виду, если вам действительно нужно, ответ на ваш технический вопрос - это операция dynamic_cast в C++, чтобы провести «понижение» (отбрасывание от базового к производному классу).

Но, отступая, это разумный прецедент для виртуальной функции. Спросите себя, какой общий смысл я хочу получить?

В этом случае мы хотим, чтобы все учащиеся имели идентификационный номер.

Работа Исходный код: 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 и местные обе имеют очень разные переменные, которые не имеют общей точки зрения? Как мы можем получить к ним доступ через свои собственные методы из базового класса? – user3025784

+0

Если вам действительно нужен доступ к производному типу, вы можете попробовать следующее: 'clsInternational * internationalS = dynamic_cast (s);' Тогда 'if (internationalS) {/ * вызов производных функций класса */} ' – NicholasM

Смежные вопросы