2015-01-09 3 views
0

Я довольно новичок в объектно-ориентированной программе, поэтому, возможно, это основной вопрос, но я буду благодарен за любую помощь, которую вы можете предложить.Функции наследования и вызова функции

Если у меня есть класс B, который является производным от класса A, есть ли способ для объектов класса B получить доступ к функциям-членам класса B изнутри функций-членов класса A? Итак, в приведенном ниже примере я мог бы вызвать функцию function2 из функции function1, если объект, первоначально вызывающий функцию1, имеет тип B. Возможно ли это, и если да, то как это сделать? Благодаря!

class A 
    { 
    public: 
     int a; 
     int b; 
     A(){} 
     A(int a, int b) { this->a = a; this->b = b; } 
     int function1();// { call function2 if class B } 
    }; 
    class B : public A 
    { 
    public: 
     int c; 
     int d; 
     B(){} 
     B(int c, int d) { this->c = c; this->d = d; } 
     int function2(); 
    }; 

ответ

1

Да. Вы должны определить function2() как виртуальную функцию в классе A. Тогда вызов ее из function1 приведет к выходу function2() B, если объект фактически является B. Например:

class A 
    { 
    public: 
     int a; 
     int b; 
     A(){} 
     A(int a, int b) { this->a = a; this->b = b; } 
     int function1() { return this->function2(); } 
     virtual int function2() { return 0; } 
    }; 
    class B : public A 
    { 
    public: 
     int c; 
     int d; 
     B(){} 
     B(int c, int d) { this->c = c; this->d = d; } 
     int function2() override { return 999; } 
    }; 

Если нет разумной реализации function2 для A, то она никогда не будет иметь смысл иметь A объект. Вы можете выразить это, объявив function2 чистым виртуальным; например

virtual int function2() = 0; 
4

Функция внутри A не имеет ни малейшего представления о том, что класс B, который расширяет A существует и какие методы он имеет.

Чтобы иметь возможность использовать конкретный метод, реализованный в B из A, вам необходимо объявить его в A как virtual, возможно, чисто виртуальным (= 0).

class A { 
    protected: 
    virtual void function2() = 0; 

    public: 
    void function1() { this->function2(); } 
} 

class B : public A { 
    protected: 
    void function2() override { ... } 
} 

virtual метод разрешен во время выполнения, это означает, что при вызове, тем более конкретная реализация для объекта, на котором она называется выполняется. Чистый метод virtual не имеет какой-либо базовой реализации, это делает абстрактную абстракцию A и запрещает ее создание.

EDIT: последнее примечание, не вызывайте virtual методы из базовых конструкторов или деструкторов. Это опасная и плохая практика, а не то, что это ваш случай, но вы никогда не знаете.

0

virtual позволяет переопределить функцию в родительском классе.

class A 
{ 
public: 
    A(){} 
    A(int a, int b):a(a), b(b) {} 
    int function1() { return this->function2(); } 
    virtual int function2() { //what function2 in parent class should do } 
private: 
    int a; 
    int b; 
}; 
class B : public A 
{ 
public: 
    B(){} 
    B(int c, int d):c(c), d(d) {} 
    int function2() { //what function2 in child class should do } 
private: 
    int c; 
    int d; 
}; 
Смежные вопросы