2013-12-16 7 views
0

У меня есть класс Signal и Image, и оба класса имеют метод с тем же именем, но с разными входными и выходными параметрами. Это разрешено?метод вызова из базового класса в методе производного класса

template <class T> class Signal { 
    Signal<T> zeroPadding(Signal<T>); 
    } 

    template <class T> class Image:public Signal<T> 
    { 
    public: 
    Image(void); 
     ~Image(void); 
     Image(int,int); 
     Image(int,int,double); 
     Image(int,int,double,double); 
      Image<T> zeroPadding(Image<T>); 

    template <class T> Image<T>::Image(int width,int height):Signal(width,height) {} 

    template <class T> Image<T>::Image(int width,int height,double dt):Signal(width,height,dt) {} 

    template <class T> Image<T>::Image(int width,int height,double dt,double t0):Signal(width,height,dt,t0) {} 


    template <class T> Image<T> Image<T>::zeroPadding(Image<T> im2){ 
     Image<T> i1 =(*this); 
     Image<T> i2 =im2; 

     if (i1.getHeight()==im2.getHeight()){ 
      i2.zeroPadding(i1); /* I want to call zeroPadding function from class Signal<T>. How I can convert i1 and i2 to class Signal<T> without initialization?*/ 
     } 

} 
+0

Можете ли вы исправить свое форматирование, чтобы сделать это доступным для чтения? – Chad

+1

Отметьте имя: 'i2.Signal :: zeroPadding (i1);' Квалифицированное имя указывает, где искать функцию. 'i1' автоматически преобразуется в' Shape' путем [slicing] (http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c). Конечно, ваш код странный. Почему вы делаете копию 'this' в функции? – jrok

+0

Я считаю, что вы можете 'static_cast &> (i2) .zeroPadding (i1);' также. См.: Http://ideone.com/ej1C1T – Chad

ответ

0

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

Для вызова функции базового класса из метода потомка, хотя, метод базового класса должен быть виден. В примере кода вопроса Signal<T>::zeroPadding является конфиденциальным, поэтому только код в методах, принадлежащих непосредственно Signal<T> (и его друзьям, но не обязательно потомкам), может вызывать эту функцию.

Для вызова Signal<T>::zeroPadding из Image<T>::zeroPadding, бывший должны иметь по крайней мере защищены видимость.

+0

Я не помещал здесь, а в код Сигнал :: zeroPadding является общедоступным. – user3094708

+0

У меня ошибка Ошибка ошибка LNK2019: неразрешенный внешний символ "public: __thiscall Сигнал :: ~ Сигнал (void)" (?? 1? $ Signal @ H @@ QAE @ XZ), на который ссылается функция "public: __thiscall Изображение :: ~ Изображение (void) "(?? 1? $ Image @ H @@ QAE @ XZ) – user3094708

+0

У меня есть эта ошибка в строке if (getHeight() == im2.getHeight()), потому что getHeight () является функцией из класса Signal и im2 является объектом класса Image поэтому преобразование не работает. Но в основном у меня нет ошибки. Почему? int main() { \t Изображение * a = новое изображение (2,3); \t Изображение * b = новое Изображение (1,3); \t (* a) .getWidth(); // здесь я получил 2 без ошибок \t (* a) .getHeight(); // здесь я получил 3 без ошибок \t (* a) .zeroPadding (* b); } – user3094708

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