Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2010, 11:35   #1
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию Класс, наследование

Добрый день!

Собственно вопрос: если в родительском классе определен и реализован виртуальный метод, обязательно переопределять его в дочернем?

Код:
Код:
class OneTwo
{
public:
	OneTwo(){}

	virtual void Print() = 0;
};

class One : virtual public OneTwo
{
public:
	One(){}
	virtual void Print() override 
	{
		std::cout<<"One!";
	}
};

class A : virtual public OneTwo
{
public:
	A(char *pS):pStr(pS){}

	char &GetString() {return *pStr;}
private:
	char *pStr;
};

class myClass1 : public One, public A
{
public:
	myClass1(char *pStr): A(pStr) {} 
};
Вылезает варнинг:
Цитата:
warning C4250: 'myClass1' : inherits 'One::One::Print' via dominance
В принципе не фолсит, но варнинг меня смущает. Как избавиться от него? ну и естественно не получается создать объект класса myClass1
Цитата:
cannot instantiate abstract class
Быть радикальным - значит понять вещь в её корне. К.Маркс

Последний раз редактировалось nazavrik; 29.01.2010 в 11:49.
nazavrik вне форума Ответить с цитированием
Старый 29.01.2010, 11:49   #2
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
если в родительском классе определен и реализован виртуальный метод, обязательно переопределять его в дочернем?
Во-первых он у вас не реализован. У вас в родительском классе чисто виртуальная функция. И соответственно, в дочерних классах нужно её переопределять. Кстати ключевым словом override уже давно не пользуются. Кстати у вас ошибки в коде, слово virtual в методе Print в дочерних классах. Советую для начала почитать книгу Г. Шилдта. "Самоучитель С++" стр. 306

Последний раз редактировалось profi; 29.01.2010 в 12:00.
profi вне форума Ответить с цитированием
Старый 29.01.2010, 11:52   #3
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Во-первых он у вас не реализован.
а это что:

Код:
	virtual void Print() override 
	{
		std::cout<<"One!";
	}
Цитата:
Кстати ключевым словом override уже давно не пользуются.
а чем пользуются?
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 29.01.2010, 11:55   #4
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

В классе OneTwo не реализован метод Print.

Цитата:
а чем пользуются?
Просто его не пишут. Я даже страницу книги указал. Почитайте. Лучше раз прочитать и спросить, чем по крупинкам на форуме спрашивать.

Последний раз редактировалось profi; 29.01.2010 в 12:05.
profi вне форума Ответить с цитированием
Старый 29.01.2010, 13:31   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Кстати у вас ошибки в коде, слово virtual в методе Print в дочерних классах.
Это не ошибка. Наличие/отсутствие virtual совершенно ничего не меняет. Тут исключительно вопрос предпочтений программиста в плане оформления кода.
Если из минусов тут пожалуй только необходимость синхронизировать виртуальность методов (сделали метод невиртуальным в базовом классе, значит нужно его делать невиртуальным во всех его потомках), то из плюсов:
1) не нужно смотреть базовый класс, чтобы узнать какие методы виртуальные, а какие нет;
2) Если в процессе рефакторинга "выкинуть" базовый класс, то не появятся непонятные баги из-за того, что виртуальные функции стали вдруг невиртуальными;
...
pu4koff вне форума Ответить с цитированием
Старый 29.01.2010, 13:37   #6
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
Наличие/отсутствие virtual совершенно ничего не меняет.
Покажите мне хоть одну книгу где в дочерних классах используется слово virtual для виртуальных методов. Компилятор хоть это пропускает, но все равно лучше так не делать.

nazavrik вот пример:

Код:
#include <iostream.h>

class General
{
        public:
                int i;
                virtual void Print() = 0;
                virtual void SetVal(int x) = 0;
};

class A: virtual public General
{
        public:
                void SetVal(int x){ i = x; }
                void Print(){ cout << i << "\n"; }
};

class B: virtual public General
{
        public:
                void SetVal(int x){ i = x; }
                void Print(){ cout << i << "\n"; }
};

class C: public A, public B
{
        public:
                void SetVal(int x){ i = x; }
                void Print(){ cout << i << "\n"; }
};

int main()
{
        General *pG;

        A aaa;
        B bbb;
        C ccc;

        pG = &aaa;
        pG->SetVal(1);
        pG->Print();

        pG = &bbb;
        pG->SetVal(2);
        pG->Print();

        pG = &ccc;
        pG->SetVal(3);
        pG->Print();

        cin.get();

        return 0;
}

Последний раз редактировалось profi; 29.01.2010 в 13:51.
profi вне форума Ответить с цитированием
Старый 29.01.2010, 14:08   #7
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Покажите мне хоть одну книгу где в дочерних классах используется слово virtual для виртуальных методов.
Дж.Либерти "Освой самостоятельно С++ за 21 день"(2008), с.407-408 =)

Спасибо за пример! Как разберусь, отпишусь что да как.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 29.01.2010, 14:10   #8
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Цитата:
Освой самостоятельно С++ за 21 день
Я не читаю книги типа: "Самоучитель С++ для чайников" или "Освой С++ за неделю" и т.д. т.п и вам не советую. Лучше почитайте книги С. Прата и Г.Шилдта. Вот в них действительно хорошо объясняется все.
profi вне форума Ответить с цитированием
Старый 29.01.2010, 16:25   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от profi Посмотреть сообщение
Покажите мне хоть одну книгу где в дочерних классах используется слово virtual для виртуальных методов.
Покажите мне хоть одну книгу, в которой уделяется внимание оформлению кода. Я лично не видел ни одной книги, по которой можно учиться писать код не для университетских лабораторных. Ни необходимой обработки исключений, ни слежения за утечками памяти, а уж про наличие/отсутствие const, virtual и т.п. и говорить не приходится.
У обоих вариантов свои плюсы и минусы, а потому называть один из них ошибочным мне видится некорректным.
Цитата:
Сообщение от profi Посмотреть сообщение
Компилятор хоть это пропускает, но все равно лучше так не делать.
Почему? Что не так в этих "лишних" virtual?
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Наследование на C++ dziga1989 Помощь студентам 5 22.10.2009 11:25
Наследование alex_triton Общие вопросы C/C++ 0 19.10.2009 20:25
Наследование beregok Общие вопросы C/C++ 1 04.07.2009 22:39
Наследование z3rg Общие вопросы C/C++ 9 30.04.2009 20:43
Наследование: абстрактный класс zak Общие вопросы C/C++ 4 22.12.2007 13:49