Re: Перегрузка функций в классе наследнике
От: jazzer Россия Skype: enerjazzer
Дата: 20.12.02 13:40
Оценка: 7 (2)
Здравствуйте, Sablezub, Вы писали:

S>есть два класса


S>class CSMTrinity: public CSxTrinity

S>{
S>public:
S> CSMTrinity();
S> virtual ~CSMTrinity();

S> using CSxTrinity::SM_Compare;

double SM_Compare(CSMTrinity& SMTrinity);

S>};

S>[/code]
этим ты введешь функцию из базового класса в область имен производного, и тогда в этой области имен будет 2 одинаковых имени и для них будет действовать перегрузка.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Перегрузка функций в классе наследнике
От: Anton V. Kolotaev  
Дата: 20.12.02 12:24
Оценка: 2 (2)
Здравствуйте, Sablezub, Вы писали:

SMTrinity.CSxTrinity::SM_Compare(SxTrinity);

// или так

((CSxTrinity&)(SmTrinity)).SM_Compare(SxTrinity);
... << RSDN@Home 1.0 beta 3 >>
Перегрузка функций в классе наследнике
От: Sablezub  
Дата: 20.12.02 12:16
Оценка:
есть два класса

class CSxTrinity: public CBlackboardObject, virtual public CDependent 
{
public:
    CSxTrinity();
    virtual ~CSxTrinity();
    
    double SM_Compare(CSxTrinity& SxTrinity);
};

class CSMTrinity: public CSxTrinity 
{
public:
    CSMTrinity();
    virtual ~CSMTrinity();

    double SM_Compare(CSMTrinity& SMTrinity);

};



при вызове ...

CSMTrinity SMTrinity;
CSxTrinity SxTrinity;

SMTrinity.SM_Compare(SxTrinity);

дает ошибку что не может преобразовать тип СSxTrinity& к СSMTrinity&. Почему не вызывается функция базового класса? Спасибо....
Re: Перегрузка функций в классе наследнике
От: Anton V. Kolotaev  
Дата: 20.12.02 12:20
Оценка:
Здравствуйте, Sablezub, Вы писали:


S>дает ошибку что не может преобразовать тип СSxTrinity& к СSMTrinity&. Почему не вызывается функция базового класса? Спасибо....


И не должна. У тебя есть переменная типа CSMTrinity и ты вызываешь метод CSMTrinity::SM_Compare....

А что тебе нужно?
... << RSDN@Home 1.0 beta 3 >>
Re: Перегрузка функций в классе наследнике
От: cpp Россия http://www.elecard.com
Дата: 20.12.02 12:38
Оценка:
Здравствуйте, Sablezub, Вы писали:

S>есть два класса


S>
S>class CSxTrinity: public CBlackboardObject, virtual public CDependent 
S>{
S>public:
S>    CSxTrinity();
S>    virtual ~CSxTrinity();
S>    
S>    double SM_Compare(CSxTrinity& SxTrinity);
S>};

S>class CSMTrinity: public CSxTrinity 
S>{
S>public:
S>    CSMTrinity();
S>    virtual ~CSMTrinity();

S>    double SM_Compare(CSMTrinity& SMTrinity);

S>};
S>


S>

S>при вызове ...

S>CSMTrinity SMTrinity;

S>CSxTrinity SxTrinity;

S>SMTrinity.SM_Compare(SxTrinity);


S>дает ошибку что не может преобразовать тип СSxTrinity& к СSMTrinity&. Почему не вызывается функция базового класса? Спасибо....


Насколько я понимаю можно SxTrinity.SM_Compare(SMTrinity);, но не наоборот, так как объект родительского класса нельзя преобразовать к объекту класса наследника, а наоборот можно.
Сергей.
Re: Перегрузка функций в классе наследнике
От: Аноним  
Дата: 20.12.02 12:46
Оценка:
Потому как функуия, переопределенная в самом последнем твоем классе, принимает ссылку на объект этого же класса, а ты даешь обект базового класса.
Можно использовать static_cast, но только при условии, что ссылка, которую ты будешь преобразовывать, в действительности ссылается на CSMTrinity
Re: Перегрузка функций в классе наследнике
От: Рек Россия  
Дата: 20.12.02 13:03
Оценка:
Здравствуйте, Sablezub, Вы писали:

S>есть два класса


S>
S>class CSxTrinity: public CBlackboardObject, virtual public CDependent 
S>{
S>public:
S>    CSxTrinity();
S>    virtual ~CSxTrinity();
S>    
S>    double SM_Compare(CSxTrinity& SxTrinity);
S>};

S>class CSMTrinity: public CSxTrinity 
S>{
S>public:
S>    CSMTrinity();
S>    virtual ~CSMTrinity();

S>    double SM_Compare(CSMTrinity& SMTrinity);

S>};
S>


S>

S>при вызове ...

Name hiding ("сокрытие имён" — ты найдёшь много веток обсуждающих это явление).

Объявление в производном классе метода с именем, которое используется
для методов базового класса, скрывает все эти методы базового класса.
Таковы правила С++. Ничего не попишешь...

Вместо того чтобы городить такой огород

((CSxTrinity&)(SmTrinity)).SM_Compare(SxTrinity);


можно просто дать разные имена методам.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.