Я пытаюсь реализовать некоторые производные классы, которые наследуют часть своего поведения из базового класса. Базовый класс что-то вроде этого:Виртуальные методы абстракции и чистой
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», но я получаю исключение сказать «чисто виртуальный метод, называемый». Я подхожу к этому неправильно? Или я пропускаю что-то в декларации классов и членов, и поэтому я достигаю этого необъяснимого результата? Или это на самом деле ожидаемый результат, и если да, то как я могу достичь того, что мне нужно?
Дайте все классовые виртуальные деструкторы. –
Вам не нужен бит 'string' вокруг' 'One ''. Хотя это всего лишь простой пример, вам не нужно 'new' в вашей основной функции. Функция 'printf' неверна. Строки C и std :: strings не конкатенируются таким образом. Попробуйте 'cout', что проще. –
Прочтите https://isocpp.org/wiki/faq/strange-inheritance#calling-virtuals-fromcctors и следующий ответ. – aschepler