2013-05-22 2 views
1
#include<stdio.h> 

class parent 
{ 
public: 
    parent() 
    { 
    } 
}; 

class child : public parent 
{ 
public: 
    child() 
    { 
    } 
}; 

class master 
{ 
public: 
    void view(parent a) 
    { 
     printf("view parent instances"); 
    } 
    void view(child b) 
    { 
     printf("view child instances"); 
    } 
}; 

int main() 
{ 
    parent *ptr; 
    master mymaster; 

    ptr = new child; 

    mymaster.view(*ptr); 

    return 0; 
} 

вывод: «просмотреть родительские экземпляры» Я создаю указатель из родительского класса. то я объявил этот указатель как дочерний. когда я запускаю mymaster.view (* ptr); , это всегда относится к первой функции просмотра (void view (parent a)), как заставить ее перейти (void view (child b)). thankyouКак получить доступ к дочерним экземплярам

ответ

0

Тип *(parent*) - parent, поэтому метод, который вызывается, - view(parent). Если вы хотите вызвать view(child), перед тем, как передать его, вам необходимо наложить указатель на child* ...

Вы используете ООП назад. Вы не определяете несколько методов, которые знают, как потреблять каждый конкретный тип подкласса, вы определяете один метод, который может уважать контракт, предоставляемый родительским классом, и подклассы выполняют свою собственную работу внутри.

0

ptr является указателем на объект parent. Если вы хотите вызвать функцию view(child), вам необходимо передать объект child на вызов функции.

В качестве альтернативы, вы можете привести его к child указатель

mymaster.view(*(child*)ptr); 

, но вы, вероятно, в конечном итоге со всеми видами других проблем.

0

Компилятор решает соответствующий метод в соответствии с лучшим выбором.

Компилятор видит, что переменная имеет тип parent, поэтому он вызывает метод сопоставления.

3

С небольшим рефакторингом и немного другим подходом вы можете использовать функции virtual. Это позволяет использовать функцию из производных классов при вызове с использованием указателя, как показано ниже.

#include<stdio.h> 

class parent 
{ 
public: 
    parent() 
    { 
    } 
    virtual void view() 
    { 
     printf("View parent"); 
    } 
}; 

class child : public parent 
{ 
public: 
    child() 
    { 
    } 
    virtual void view() 
    { 
     printf("View child"); 
    } 
}; 

class master 
{ 
public: 
    void view(parent *a) 
    { 
     a->view(); 
    } 
}; 

int main() 
{ 
    parent *ptr; 
    master mymaster; 
    ptr = new child; 
    mymaster.view(ptr); 
    return 0; 
} 

Это будет выводить "Вид ребенка". Тот же код без ключевых слов virtual выведет «Просмотр родителя». Обратите внимание, что ключевое слово должно быть только в родительском классе, но для ясности также часто используется в производных классах.

Wikipedia article на виртуальных функций объясняет ситуацию очень хорошо:

Виртуальные функции разрешены «поздно». Если рассматриваемая функция равна «virtual» в базовом классе, реализация самого производного класса функции вызывается в соответствии с фактическим типом объекта , на который ссылается, независимо от объявленного типа указателя или ссылка , Если он не является «виртуальным», метод разрешен «раньше», а функция, вызываемая, выбирается в соответствии с объявленным типом указателя или ссылки .

Поскольку фактический тип объекта здесь является ребенком, виртуальная функция гарантирует, что ребенок «s функция называется, даже если указатель имеет родителя типа.

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