2015-01-08 3 views
1

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

class Number { 
public: 
    virtual string getName() = 0; 
    void writeName() { 
    string name = this->getName(); 
    printf("My Name is %s\n", name.c_str()); 
    } 

    Number() { 
    this->writeName(); 
    } 
}; 

class One : Number { 
string getName() {return string("One");} 
}; 

class Two : Number { 
string getName() {return string("Two");} 
}; 

int main() { 
One *n = new One(); 
} 

Я бы ожидать, что это выход «Мое имя One», но я получаю исключение сказать «чисто виртуальный метод, называемый». Я подхожу к этому неправильно? Или я пропускаю что-то в декларации классов и членов, и поэтому я достигаю этого необъяснимого результата? Или это на самом деле ожидаемый результат, и если да, то как я могу достичь того, что мне нужно?

+1

Дайте все классовые виртуальные деструкторы. –

+0

Вам не нужен бит 'string' вокруг' 'One ''. Хотя это всего лишь простой пример, вам не нужно 'new' в вашей основной функции. Функция 'printf' неверна. Строки C и std :: strings не конкатенируются таким образом. Попробуйте 'cout', что проще. –

+1

Прочтите https://isocpp.org/wiki/faq/strange-inheritance#calling-virtuals-fromcctors и следующий ответ. – aschepler

ответ

3

Вы получаете это исключение, потому что вы вызываете метод изнутри конструктора. Согласно правилам C++, все виртуальные функции-члены внутри конструктора классов отправляются в реализации внутри самого класса, а не его подкласса. Логика этого решения заключается в том, что в противном случае функция-член будет работать на объекте до завершения его инициализации.

Существует не обходное решение: если вам нужны конструкторы подклассов для выполнения различных действий, код, выполняющий эти действия, должен быть помещен внутри самих конструкторов подкласса.

+0

Спасибо. удаление вызова writeName() из конструктора в основной разрешало проблему. Кажется, что чистить его внутри конструктора, но он работает как шарм :) – BlunT

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