Я хочу создать абстрактный класс с чистой виртуальной функцией, которая вызывается НЕ чисто виртуальным конструктором. Ниже мой файл class.hpp
:
#ifndef __CLASS_HPP__
#define __CLASS_HPP__
#include <iostream>
class Parent {
public:
Parent(){
helloWorld(); // forced to say hello when constructor called
};
virtual void helloWorld() = 0; // no standard hello...
};
class Child : public Parent {
public:
void helloWorld(){ // childs implementation of helloWorld
std::cout << "Hello, World!\n";
};
};
#endif
В этом примере у меня есть родительский класс с чистой виртуальной функцией helloWorld()
. Я хочу, чтобы каждый производный класс говорил "привет" при вызове конструктора; следовательно, почему helloWorld()
находится в конструкторе родительского класса. Тем не менее, я хочу, чтобы каждый производный класс был ПРИНУДИТЕЛЬНО выбирать, как он будет говорить «привет», а не иметь метод по умолчанию. Это возможно? Если я попытаюсь скомпилировать это с помощью g++, я получу ошибку, что конструктор вызывает чистую виртуальную функцию. Мой main.cpp
это:
#include "class.hpp"
int main(){
Child c;
return 0;
}
Я компилирую с использованием g++ main.cpp -o main.out
, и в результате возникает ошибка:
In file included from main.cpp:1:0:
class.hpp: In constructor ‘Parent::Parent()’:
class.hpp:9:16: warning: pure virtual ‘virtual void Parent::helloWorld()’ called from constructor [enabled by default]
Любые предложения о том, как получить подобную настройку в законном порядке?
НОВЫЙ ВОПРОС
DyP обратил мое внимание на то, что конструктор не использует никаких переопределенных функций, поэтому то, что я хочу сделать, невозможно в том виде, в котором я его настроил. Тем не менее, я все еще хотел бы заставить любой производный конструктор вызывать функцию helloWorld()
, есть ли способ сделать это?
Parent::helloWorld
, что является чистым, отсюда и предупреждение (чистая виртуальная функция все еще может иметь реализацию). Вы можете передать строку из производного класса в ctor базового класса через параметр и выполнить вывод в базовом классе. Также возможно: 2-ступенчатая инициализация. - person dyp   schedule 11.09.2013__CLASS_HPP__
), и имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы для реализации. Не используйте их. - person Pete Becker   schedule 11.09.2013__CLASS_HPP__
в качестве защиты включения в свой код. Он имеет два последовательных знака подчеркивания (в начале и в конце), поэтому он зарезервирован для реализации. - person Pete Becker   schedule 11.09.2013__CLASS_HPP__
где-либо в своем коде. Это зарезервировано для реализации. - person Pete Becker   schedule 11.09.2013