вопрос о наследовании
От: Bai  
Дата: 24.06.02 09:28
Оценка:
есть два класса в родительском опрелена функция, возвращает тип дабл
а в потомке хочется получить флоат
это не компилится в VС++ почему
ведь "В сигнатуру включается модификатор const, но не включается возвращаемое значение"
почему??
class CParent
{
public:
CParent(){};
virtual ~CParent(){};
virtual double GetF()
{
return 1;
};

};
class CChilde:public CParent
{
public:
CChilde(){};
virtual ~CChilde(){};
float GetF()
{
return 2;
};

};
Re: вопрос о наследовании
От: Владимир Сторожевых Россия  
Дата: 24.06.02 09:46
Оценка: 7 (2)
Здравствуйте Bai, Вы писали:

Bai>есть два класса в родительском опрелена функция, возвращает тип дабл

Bai>а в потомке хочется получить флоат
Bai>это не компилится в VС++ почему
Bai>ведь "В сигнатуру включается модификатор const, но не включается возвращаемое значение"
Bai>почему??

Стандарт, 10.3 :
The return type of an overriding function shall be either identical
to the return type of the overridden function or covariant with the
classes of the functions.
Re: вопрос о наследовании
От: Dima2  
Дата: 24.06.02 10:26
Оценка: 2 (1)
Здравствуйте Bai, Вы писали:

А причем тут сигнатура ф-ии. Как уже правильно сказали ввозвращаемый тип переопределяемой ф-ии должен совпадать или быть ковариантным, т.е.

struct A
{
    virtual double func() { return 0; }
    virtual const A* getOb() { return this; }
};

struct B : public A
{
    //virtual float func() {}    //Error
    virtual const B* getOb() { return this; }
};


Заметь ф-я getOb() виртуальная, однако возвращает разные типы. Это допускается cтандартом, но это не будет у тебя компилится в VC6, но в VC7 этот баг уже исправлен и все чудно компилится.
Re: вопрос о наследовании
От: AlbertM  
Дата: 24.06.02 10:45
Оценка:
Здравствуйте Bai, Вы писали:

Bai>есть два класса в родительском опрелена функция, возвращает тип дабл

Bai>а в потомке хочется получить флоат
Bai>это не компилится в VС++ почему
Bai>ведь "В сигнатуру включается модификатор const, но не включается возвращаемое значение"

Не нужно смешивать перегрузку (overloading) функций и переопределение (overriding) функций. При перегрузке возвращаемое значение как раз может быть любое, а при переопределении... читай выше и там же.

Алик.
С уважением
А М
Re[2]: вопрос о наследовании
От: Аноним  
Дата: 24.06.02 10:46
Оценка:
Здравствуйте AlbertM, Вы писали:

AM>Здравствуйте Bai, Вы писали:


Bai>>есть два класса в родительском опрелена функция, возвращает тип дабл

Bai>>а в потомке хочется получить флоат
Bai>>это не компилится в VС++ почему
Bai>>ведь "В сигнатуру включается модификатор const, но не включается возвращаемое значение"

AM>Не нужно смешивать перегрузку (overloading) функций и переопределение (overriding) функций. При перегрузке возвращаемое значение как раз может быть любое, а при переопределении... читай выше и там же.


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