2012-05-15 3 views
1

Я пытаюсь переопределить метод базового класса, используемый другим методом в базовом классе; однако, когда производный класс вызывает метод-метод базового класса, производный использованный-метод никогда не выполняется, а вместо этого используется метод-метод базового класса. Вот пример:C++ сделать переопределенные методы базового класса в дочернем классе

#include <iostream> 
using namespace std; 
class Base { 
public: 
    Base() {} 
    virtual ~Base() {} 
    void printLeft() { cout << this->getLeft(); } 
    int getLeft() { return 0; } 
}; 

class Derived: public Base { 
public: 
    Derived() {} 
    virtual ~Derived() {} 
    int getLeft() { return 1; } 
}; 
int main(int argc, char *argv[]) { 
    Derived d = Derived(); 
    d.printLeft(); 
} 

Запуск main()0 отпечатков, указывающих getLeft() метода Base «ы был использован вместо метода производного объекта.

Как я могу изменить этот код, так Derived::getLeft() называется при вызове из экземпляра Derived?

+0

Извините, у меня нет времени. Этот проект должен быть завтра. Спасибо, однако, за полезное предложение. – weberc2

+0

Для лифтера (-ов), есть ли что-то особенное в этом вопросе? Должен ли я что-то прояснить? Я пытался исследовать, но, поскольку я не знаю терминологию феномена, который я пытаюсь описать, я не смог найти никаких подходящих результатов. – weberc2

+0

Я остановил этот вопрос, но я этого не делал, пока вы не сказали мне, что вы не хотите читать книгу, чтобы изучить C++. –

ответ

6

Вам просто нужно сделать getLeft виртуальными:

class Base { 
public: 
    Base() {} 
    virtual ~Base() {} 
    void printLeft() { cout << this->getLeft(); } 
    virtual int getLeft() { return 0; } 
}; 

По умолчанию в C++, функция-членов не является виртуальной. То есть вы не можете переопределить их в подклассе.

+1

Спасибо, сэр.Вы джентльмен и ученый. – weberc2

+2

Ну, вы * можете * переопределить их, это просто, что переопределение не будет иметь никакого эффекта при вызове указателя базового класса или ссылки. – JohnMcG

+0

Добро пожаловать. – Nick

1

Для не виртуальных функций статический тип объекта используется для определения метода класса.

В вашем случае вы звоните getLeft() из Base::printLeft(). Тип this - Base*, поэтому функция называется Base::getLeft().

Способ использования этого ключевого слова virtual. В этом случае таблица виртуальных функций будет использоваться, чтобы определить, какая версия getLeft() называть, в данном случае Derived.

Вы можете вызвать такое поведение, предваряя virtual к декларациям printLeft в обоих Base и Derived.

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