Форум программистов, компьютерный форум CyberForum.ru

Наследование в C++, или болезненный переход с Java - C++

Восстановить пароль Регистрация
 
Anion
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 16
10.01.2013, 12:14     Наследование в C++, или болезненный переход с Java #1
Здравствуйте!
Есть такая задача: нужно два класса, две разные реализации абстрактного родительского(т.е. в нём только объявление функций).
Вопрос: Если так сделать то можно будет из экземпляра родительского класса обращаться к функциям дочернего класса?
Пример: Класс игрока, и два подкласса: ИИ и пользователь.
Если время есть, то пожалуйста с примером.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.01.2013, 13:14     Наследование в C++, или болезненный переход с Java #2
Anion,
Вопрос: Если так сделать то можно будет из экземпляра родительского класса обращаться к функциям дочернего класса?
Конкретнее можно? Это имеется ввиду?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
class Player
{
public:
   virtual ~Player() { }
   void start() const
   {
      call();
   }
private:
   virtual void call() const = 0;
};
 
class UserPlayer : public Player
{
   void call() const
   {
      std::cout << "UserPlayer called" << std::endl;
   }
};
 
class CPUPlayer : public Player
{
   void call() const
   {
      std::cout << "CPUPlayer called" << std::endl;
   }
};
 
int main()
{
   Player* p = new UserPlayer();
   p->start();
   delete p;
   p = new CPUPlayer();
   p->start();
   delete p;
}
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
10.01.2013, 13:17     Наследование в C++, или болезненный переход с Java #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class gamer
{
public:
    std::string get_name(void) {return name;}
    virtual bool do_something(void) = 0;
 
private:
    std::string name;
};
class ai: public gamer
{
public:
    virtual bool do_something(void) {return get_name() == "ai";}
};
class user: public gamer
{
public:
    virtual bool do_something(void) {return get_name() == "user";}
};
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 13:23     Наследование в C++, или болезненный переход с Java #4
из экземпляра родительского класса обращаться к функциям дочернего класса?
а напишите код на java не исользуя static как вы себе это представляете? как класс родителя может знать о чем то что есть у его предков, тогда нарушается весь принцип наследования
Anion
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 16
10.01.2013, 14:29  [ТС]     Наследование в C++, или болезненный переход с Java #5
Цитата Сообщение от Nixy Посмотреть сообщение
а напишите код на java не исользуя static как вы себе это представляете? как класс родителя может знать о чем то что есть у его предков, тогда нарушается весь принцип наследования
Окей. Скажу по другому: вызов перегруженных потомком функций из экземпляра род. класса.

На java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Par {
  void method() {System.out.println("Parent");}
}
 
class Daugh extends Par {
  void method() {System.out.println("Daughter");}
}
 
class Son {
  void method() {System.out.println("Son");}
}
 
class main() {
  Par parent = new Par();
  Par daughter = new Daught();
  Par son = new Son();
  parent.method();
  daughter.method();
  son.method();
}
ForEveR, Спасибо! Скорее всего оно))... А обязательно виртуальные методы делать? Перегрузкой нельзя обойтись?
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
10.01.2013, 14:36     Наследование в C++, или болезненный переход с Java #6
Цитата Сообщение от Anion Посмотреть сообщение
вызов перегруженных потомком функций из экземпляра род. класса.
а это везде где ООП есть доступно,и оба ответа содержат в себе это
Anion
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 16
10.01.2013, 14:44  [ТС]     Наследование в C++, или болезненный переход с Java #7
Компилируемо:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Par {
  void method() {System.out.println("Parent");}
}
 
class Daugh extends Par {
  void method() {System.out.println("Daughter");}
}
 
class Son extends Par {
  void method() {System.out.println("Son");}
}
 
class Main {
    public static void main(String args[]) {
      Par parent = new Par();
      Par daughter = new Daugh();
      Par son = new Son();
      parent.method();
      daughter.method();
      son.method();
    }
}
Добавлено через 2 минуты
Цитата Сообщение от Nixy Посмотреть сообщение
а это везде где ООП есть доступно,и оба ответа содержат в себе это
Мне нужен был пример... ммм... присвоения екземпляру родителя класс потомка, и использование из экземпляра родителя методов именно потомка.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.01.2013, 14:48     Наследование в C++, или болезненный переход с Java #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Par {
  virtual void method() {std::cout << "Parent" << std::endl;}
}
 
class Daugh : public Par {
  void method() {std::cout << "Daughter" << std::endl;}
}
 
class Son : public Par {
  void method() {std::cout << "Son" << std::endl;}
}
 
int main() {
      Par* parent = new Par();
      Par* daughter = new Daugh();
      Par* son = new Son();
      parent->method();
      daughter->method();
      son->method();
      delete parent;
      delete daughter;
      delete son;
}
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
10.01.2013, 15:00     Наследование в C++, или болезненный переход с Java #9
ForEveR, отсутствие слова виртуал напротив методов производных классов не меняет того факта что они все равно виртуальные. эстетика разве. но скорее - введение в заблуждение.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.01.2013, 15:04     Наследование в C++, или болезненный переход с Java #10
vxg, М. Я не вижу особого смысла писать virtual в методах производных классов и обычно не пишу. Это не является вводом в заблуждение для программиста на С++. А то что они являются виртуальными - ясен пень.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,281
10.01.2013, 15:17     Наследование в C++, или болезненный переход с Java #11
Цитата Сообщение от ForEveR Посмотреть сообщение
ясен пень
просто ТС вопрошал можно ли обойтись без виртуальных методов одной перегрузкой и у него могло создасться впечатление, что показанный пример как раз содержит решение в интересующем его ключе, а на деле - это то же самое
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 18:06     Наследование в C++, или болезненный переход с Java
Еще ссылки по теме:

C++ Заменить наследование классов на наследование интерфейсов
C++ SFML. Как засунуть в функцию объект класса? ИЛИ как делается наследование?
C++ Структура программы или наследование, без использования конструктора базового класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Anion
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 16
10.01.2013, 18:06  [ТС]     Наследование в C++, или болезненный переход с Java #12
Почитал статью: Виртуальные функции в C++.

Добавлено через 28 минут
Не дописал месседж.
В общем вроде всё понял.
Yandex
Объявления
10.01.2013, 18:06     Наследование в C++, или болезненный переход с Java
Ответ Создать тему
Опции темы

Текущее время: 22:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru