Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование, Как унаследовать 2 класса... но... 
V
    Опции темы
JAnty
  Дата 2.4.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Код

/***********************/// Base 
class Base
{
};
/***********************/// Docs от Base
class Docs : public  Base
{
};
/***********************/// Fils от Docs который от Base
class Fils : public Docs
{
};
/* или ***************** /// Fils от Docs и от Base
class Fils : public Docs , public Base
{
};
*/


Есть ли разница межде первым Fils и вторым?

Это сообщение отредактировал(а) JAnty - 2.4.2007, 12:14


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
Earnest
Дата 2.4.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Есть, конечно. Во втором случае Base будет присутствовать дважды, что плохо.


--------------------
...
PM   Вверх
Sartorius
Дата 2.4.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



В первом случае мы имеем возможность в Docs переопределить , что нить от Base... 
 В общем использовать первый или второй способ для доступа к функциональностиь Docs и Base зависит от конкретной задачи... Напиши поподробней, чего ты хочешь...

Добавлено через 2 минуты и 39 секунд
Earnest, мне кажется, что  JAnty, во втором случае на наследует Docs от Base
Цитата

Fils от Docs который от Base

 

Цитата

 Fils от Docs и от Base


 
PM MAIL ICQ   Вверх
JAnty
  Дата 2.4.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Я наследую от Docs который от Base
Мне надо точно знать, если в функциях Docs я изменю чонит в Base:
Fils F;

F./*Base::*/Q=1;

потом 

F./*Docs::*/func1(); // который изменит Q=3;

для F.Q это изменится?

Добавлено через 2 минуты и 21 секунду
Вообщем мне надо при помощи F менять всё, будет работать с первим методом "Fils от Docs который от Base"


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
Earnest
Дата 2.4.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(JAnty @  2.4.2007,  13:39 Найти цитируемый пост)
Мне надо точно знать

Когда надо знать точно, берем отладчик и смотрим. Еще можно отладочный вывод сделать.

Вопрос не очень поняла. 
На всякий случай:
Если ты пишешь A=3 и компилятор не ругается, то стало быть какой-то A он знает и изменит. Или у тебя большой выбор? smile   



--------------------
...
PM   Вверх
JAnty
  Дата 2.4.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Всё, до меня наконей дошло. Буду наследовать только Docs.


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
NoNo
Дата 2.4.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 14.11.2006

Репутация: нет
Всего: нет



class Fils : public Docs , public Base

Это называется "неопределённость при множественном наследовании".....

class Docs : public  Base
..так безопаснее

...хотя в действительности определись для чего тебе это.....
 


PM MAIL   Вверх
NoNo
Дата 2.4.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 14.11.2006

Репутация: нет
Всего: нет



....Можешь пользоваться операцией "::" в множественном наследовании
Например:
 (объект Fils).(Base/Docs) :: (метод/конструктор/поле)


Это сообщение отредактировал(а) NoNo - 2.4.2007, 16:06
PM MAIL   Вверх
threef
Дата 3.4.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



схема наследования
A
| \
|   B
|  /
C

запрещена, вот какая разница
PM MAIL   Вверх
Fazil6
Дата 3.4.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(threef @  3.4.2007,  14:05 Найти цитируемый пост)
запрещена, вот какая разница

почему запрещена? Теоретически это допускается

Да и практически нет ничего необычного в такой схеме.
Код

#include <iostream>
// базовый
class A
{
public:
    virtual ~A(){}
    void f()
    {
        f1();
    }
protected:    
    virtual void f1() const = 0;
    virtual void f2() const = 0;
};

class B : virtual public A
{
private:
    virtual void f1() const
    {
        std::cout << "f1 from B\n";
        f2();
    }
};

class C : public B, virtual public A
{
private:
    virtual void f2() const
    {
        std::cout << "f2 from C\n\n";
    }

};

class D : virtual public A
{
private:
    virtual void f1() const
    {
        std::cout << "f1 from D\n";
        f2();
    }
};

class E: public D, virtual public A
{
private:
    virtual void f2() const
    {
        std::cout << "f2 from E\n\n";
    }

};
class F: public D, virtual public A
{
private:
    virtual void f2() const
    {
        std::cout << "f2 from F\n\n";
    }

};

int main()
{
    C c;  // наследник от B и А
    c.f();

    E e;  // наследник от D и А со своим вариантом виртуальных ф-й 
    e.f();

    F f;  // наследник от D и А со своим вариантом виртуальных ф-й
    f.f();
    
        return 0;
} 


так что все от задачи зависит...

Это сообщение отредактировал(а) Fazil6 - 3.4.2007, 14:27
PM MAIL   Вверх
threef
Дата 3.4.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Fazil6, 
не передергивай, в исходном посте не было виртуального наследования
PM MAIL   Вверх
NoNo
Дата 3.4.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 14.11.2006

Репутация: нет
Всего: нет



threef, 
 да влюбом случае
class Fils : public Docs , public Base
компилится...значит не запрещена

Добавлено через 1 минуту и 36 секунд
Цитата(Fazil6 @ 3.4.2007,  14:13)
так что все от задачи зависит...

Верно!
PM MAIL   Вверх
threef
Дата 3.4.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



NoNo, где компилится -то ?
PM MAIL   Вверх
JAnty
  Дата 3.4.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 6.12.2004
Где: Москва

Репутация: 1
Всего: 2



Конечно не компилиться, только с virtual я с начала и сам не знал, решил сначало посоветоваться, чтоб потом сам не запутался в классах и решил не использовать  множественное наследование.
Я понял одно, множественное наследование это излишки ООП, ну или для кокихто очень сложных задач.

Добавлено через 2 минуты и 46 секунд
В VCL или в MFC есть классы с у которых есть  множественное наследование ?


--------------------
Русский справочник по WinAPI

Возможно всё, что возможно вообразить! Это и значит быть гением как я!
PM MAIL   Вверх
Fazil6
Дата 3.4.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(threef @  3.4.2007,  18:40 Найти цитируемый пост)
NoNo, где компилится -то ?


вообще-то компилится, например , VS7 - 8

Цитата(JAnty @  3.4.2007,  19:01 Найти цитируемый пост)
Конечно не компилиться


почему это не должно компилится?
Код

#include <iostream>


struct AA
{
    AA()
    {
        std::cout << "class constructor AA\n";
    }
    ~AA()
    {
        std::cout << "class destructor AA\n";
    }

};

struct BB : public AA
{
    BB()
    {
        std::cout << "class constructor BB\n";
    }
    ~BB()
    {
        std::cout << "class destructor BB\n";
    }
};

struct CC : public BB, public AA
{
    CC()
    {
        std::cout << "class constructor CC\n";
    }

    ~CC()
    {
        std::cout << "class destructor CC\n";
    }
};

int main()
{
    CC c;
    return 0;
}


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.