2012-04-08 2 views
0

Possible Duplicate:
c++ virtual function return typeDifferent возвращаемого значения из перегруженного класса

У меня есть простой, но запутанный вопрос здесь. Является ли законным иметь другой тип возвращаемого значения для переопределенных методов, чем абстракты, определенные в базовом классе? Я сделал это, и компилятор не пожаловался ... может кто-нибудь объяснить?

class MyBaseClass 
{ 
    int value; 

public: 
    virtual int getValue() = 0; 
}; 

class MyClass : public MyBaseClass 
{ 
    double value; 

public: 
    virtual double getValue(); // here!!! return is double, not int 
}; 

double MyClass::getValue() 
{ 
    return this->value; 
} 

компилятор полностью принял что-то подобное (MSVC унд MinGW) ... может кто-нибудь, пожалуйста, exaplain в какой степени это законно?

+0

Почему ваш базовый класс имеет значение int, если ваш подкласс использует double? – dexametason

+2

GCC 4.6.1 жаловался: ошибка: конфликтный тип возвращаемого значения указан для «виртуального двойного MyClass :: getValue()» – enobayram

+0

Фактически в моей программе это не int и double. Он двойной и MathVector с 3 компонентами. Базовый класс генерирует скалярный сигнал, а производный класс генерирует трехмерный сигнал. –

ответ

2

Тип возврата разрешен для разных, но только ограниченным образом, и код является незаконным. Единственный способ, с помощью которого можно изменить тип возвращаемого значения переопределения, может быть ковариантным, если возвращаемый тип базы является указателем или ссылкой. Иначе говоря: если база возвращает указатель или ссылку на базовый класс, переопределению разрешено возвращать указатель или ссылку, соответственно, классу, полученному из базы.

+0

Как вы объясните, что мой код компилируется? метод даже чист! если он не переопределяется и не определяется как новый метод, тогда компилятор должен жаловаться на чистый метод, который не используется !!! Я действительно смущен! –

+0

код, который вы отправили, не скомпилирован – juanchopanza

+0

В моем коде у меня двойной (в базовом классе) и MathVector <3,double> (в производном классе 3 - 3 измерения), а конструктор MathVector <3,double> принимает double в качестве аргумента. Может быть, программа автоматически делает неявные преобразования, чтобы заставить ее работать? –

0

Вы являетесь основным? похоже, вы написали метод и ничего больше.

Смежные вопросы