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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2011, 09:48   #1
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию Виртуальные функции и наследование

Всем привет =) Такой вопрос, как правильно отнаследовать виртуальные функции? Сделал наследование от базового класса двух других классов, а как правильно записать виртуальные функции не знаю.
Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>

using namespace std;

enum month {
	jan = 1, feb, mar, apr, may, jun, jul, aug, sep, okt, nov, dek
};
class DATE {
public:
	DATE();
	~DATE();
	virtual void Print(char smb);
	virtual unsigned Valid(unsigned dd, month mm, unsigned yy); 
	virtual unsigned SetDATE(unsigned dd, month mm, unsigned yy);
	unsigned dd;
	month mm;
	unsigned yy;
	char format;
};

class USADATE : public DATE {
public:
	void USAPrint(char smb);
};

class HolidaysDATE : public DATE {
public:
	void WhatHoliday();
};

DATE :: DATE() {
	dd = 01;
	mm = jan;
	yy = 0001;
	cout << "Constructor...\n";
}

DATE :: ~DATE() { 
	cout << "Destructor...\n";
}

void DATE :: Print(char smb) {
	cout<<dd<<smb<<mm<<smb<<yy<<"\n";
}

void USADATE :: USAPrint(char smb) {
	cout << "USA Date Format:\n";
	cout<<mm<<smb<<dd<<smb<<yy<<"\n";
}

unsigned DATE :: SetDATE(unsigned dd, month mm, unsigned yy) {
	this->dd = dd;
	this->mm = mm;
	this->yy = yy;
	return 0;
}

unsigned DATE :: Valid(unsigned dd, month mm, unsigned yy) {
    if (dd>31){
        return 0;
    }
    if ((mm==feb) && (dd>28) && (!(yy%4))){
        return 0;
    }
    if ((mm==feb) && (dd>29)){
        return 0;
    }
    return 1;
}

void HolidaysDATE :: WhatHoliday() {
	if ((dd == 18) && (mm == jan) && (yy == 1991)) {
		cout << "MyBirthday\n";
	}
	if ((dd == 01) && (mm == jan)) {
		cout << "New Year\n";
	}
	if ((dd == 07) && (mm == jan)) {
		cout << "Christmas\n";
	}
}

int main() {
	cout << "Input a separator character: ";
	char format = getch();
	cout << format << "\n";
	DATE MyDate;
	MyDate.Print(format);
    cout << "Example of Date:\n";
	MyDate.SetDATE(18, jan, 1991);
	MyDate.Print(format);
	if (MyDate.Valid(18, jan, 1991) == 1) cout << "It's OK Date\n";
    else cout << "Date is Wrong";
	USADATE MyUSADate;
	MyUSADate.SetDATE(18, jan, 1991);
	MyUSADate.Print(format);
	MyUSADate.USAPrint(format);
	HolidaysDATE MyHolidaysDate;
	MyHolidaysDate.SetDATE(01, jan, 1991);
	MyHolidaysDate.Print(format);
	MyHolidaysDate.WhatHoliday();
	getch();
	return 0;
}
Пожалуйста помогите, очень нужна ваша помощь =)
iKarma вне форума Ответить с цитированием
Старый 01.12.2011, 11:29   #2
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

в базовом классе объявляеш функцию с ключевым словом virtual потом в наследующих классах переопределяешь эту же функцию и пишешь для нее другую имплементацию
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 01.12.2011, 15:14   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Код:
class Base
{
public:
  virtual void Func()
  {
     // base implement
  }
};

class Child: public Base
{
public:
  virtual void Func()
  {
     // new implement
  }
};
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 01.12.2011, 23:12   #4
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию

А так можно?
Код:
class Base
{
public:
  virtual void Func(int a, b, c)
  {
     // base implement
  }
};

class Child: public Base
{
public:
  virtual void Func(int c)
  {
     // new implement
  }
};
iKarma вне форума Ответить с цитированием
Старый 01.12.2011, 23:51   #5
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

В таком случаи это будет перегрузка. То есть обращаясь к наследнику можно будет использовать и функцию с тремя аргументами, и функцию с одним
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
виртуальные функции vanek1 Помощь студентам 1 08.06.2011 17:49
наследование. виртуальные ф-ции, помогите с дв-ем HoOpe Помощь студентам 0 16.06.2009 01:27
Виртуальные функции bigory Помощь студентам 2 06.06.2009 22:44
НАСЛЕДОВАНИЕ И ВИРТУАЛЬНЫЕ ФУНКЦИИ С++ ermac52 Помощь студентам 1 05.06.2009 11:03
Одиночное наследование Виртуальные функции Brunette Помощь студентам 3 08.05.2008 19:23