Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > проблема с наследованием.


Автор: En_t_end 9.4.2006, 07:14
Код

class foo_main
{
public:
virtual void func();
}

class foo_ch: public foo_main
{
public:
void func_ch(){func();};
}

class foo_2ch: public foo_ch
{
public:
void func();
}

Мне надо использовать лишь foo_2ch. Но похоже такая конструкция неверна. У самого мысла пока одна, ведь foo_ch не знает о существовании foo_2ch, в котором реализованна func, к тому же для него он последний в цепочке наследования от foo_main, то есть по сути реализовать func мне надо было в нём. Но, увы, задача такова, что должен существовать промежуточный класс с дополнительной функцией, связанно это с тем, что эта(и) функции по сути не должны быть в foo_main, они там лишнии(там работа с ОС идет, а сам foo_main лишь "шаблон" виртуальных функций(интерфейс)).

Автор: chipset 9.4.2006, 07:29
Я не совсем понял вопроса. А что мешает продолжить виртуальность func в foo_ch?

Автор: En_t_end 9.4.2006, 08:37
chipset
В принципе не мешает, только вот эффекта положительного от этого нет smile

Автор: np9mi7 9.4.2006, 08:49
En_t_end, а если так:
Код

class foo_main
{
public:
    virtual void func() = 0;
}
class foo_ch: public foo_main
{
public:
    void func_ch()
    {
        func();
    };
}
class foo_2ch: public foo_ch
{
public:
    virtual void func() {};
}

Автор: MAKCim 9.4.2006, 09:08
Цитата

В принципе не мешает, только вот эффекта положительного от этого нет

а что конкретно надл получить в итоге?

Автор: En_t_end 9.4.2006, 10:18
np9mi7
Точно... ну я плох...
ЗЫ я почему-то думал, что если реализации метода нет в базовом классе, то дочерний и не пытается вызывать его... оказавывается пытается smile
Добавлено @ 10:22
MAKCim,
Цитата(MAKCim @ 9.4.2006, 13:08 Найти цитируемый пост)
а что конкретно надл получить в итоге?

Нужно получить корректно работающий код.
Если оставить в изначальном виде, то будет увы вызываться метод из базового класса ИМХО, а он там не реализован, но компилятор об этом не знает, он пытается достать реализацию, но у него ничего не выходит и он завершает компиляцию на ошибках "unresolved external symbol %%%"
Добавлено @ 10:24
np9mi7
насколько я понимаю это правильный метод составления интерфейсов ? то есть нужно точно забраковать случай реализации метода в базовом классе ?

Автор: DeadSoul 9.4.2006, 10:30
Цитата(En_t_end @ 9.4.2006, 10:18 Найти цитируемый пост)
Если оставить в изначальном виде, то будет увы вызываться метод из базового класса ИМХО, а он там не реализован, но компилятор об этом не знает, он пытается достать реализацию, но у него ничего не выходит и он завершает компиляцию на ошибках "unresolved external symbol %%%

Минимальный код вопроизводящий такую ошибку в студию.
При этом обрати внимание на изменения np9mi7.

Автор: En_t_end 9.4.2006, 10:48
DeadSoul
Код

#include "stdafx.h"

class foo_main
{
public:
virtual void func();
};

class foo_ch: public foo_main
{
public:
void func_ch(){func();};
};

class foo_2ch: public foo_ch
{
public:
void func();
};

void main()
{
foo_2ch f;
f.func_ch();
}

Добавлено @ 10:50
DeadSoul
а вообще к чему бы это ? smile
Я вроде сказал, что вопрос решился и я благодарен
np9mi7 за то что он ткнул меня носом.

Автор: DeadSoul 9.4.2006, 11:46
En_t_end, раз проблема решена, то прошу прощения(то ли ты плохо описал, то ли неверно понял)

Автор: np9mi7 9.4.2006, 21:00
En_t_end, только не пытайся сделать так:
Код

class foo_main
{
public:
    virtual void func() = 0;
}
class foo_ch: public foo_main
{
public:
     foo_ch () {func_ch ();}   /// вот тут всё упадет :))
    void func_ch()
    {
        func();
    };
}
class foo_2ch: public foo_ch
{
public:
    virtual void func() {};
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)