2013-06-18 2 views
1

Я пришел сюда, чтобы спросить кое-что, что я не могу понять самостоятельно. Я кодировал небольшой класс, который хранит массив из 32 бит и может выполнять простые математические операции, такие как + -/и *.Оператор наследования и назначения класса C++

Пусть у меня есть класс, как:

class Binary_Class 
{ 
    char bin[32];    // 32 bits array to hold an unsigned binary number 
    void set_dec(int value){}; // setting the bin[32] value based on input value 

    //i have operator + and = to perform on objects of this class. 
    Binary_Class& operator= (const Binary_Class&); 
    const Binary_Class operator+ (const Binary_Class&); 
} 

Till здесь, никаких проблем не приходят, если я объявляю 3 объектов a, b, c класса Binary_Class, затем set_dec к a и b, оператору c=a+b может можно использовать (?)

Однако я хочу, чтобы расширить класс бинарник с помощью нового класса

class Binary_Class_Extended: public Binary_Class 
{ 
    // weird functions 
} 

Если я объявляю 3 объекта a, b, c класса Binary_Class_Extended, я до сих пор в состоянии использовать c=a+b как же до этого?

В Netbean он говорит, что нет никакого оператора =, что соответствует моему c=a+b, если все из Binary_Class_Extended, но если я объявляю c как Binary_Class что заявление работы. Это означает, что a+b возвращает const Binary_Class, как будто operator+ не переносится в новый класс.

Я что-то упустил или так оно и есть? Конечно, я могу опубликовать весь код, потому что это просто задание, но я думаю, что этой информации пока достаточно.


Update

class Binary_Class 
{ 
    char bin[32];    // 32 bits array to hold an unsigned binary number 
    void set_dec(int value){}; // setting the bin[32] value based on input value 

    //i have operator + and = to perform on objects of this class. 
    Binary_Class& operator= (const Binary_Class&); 
    const Binary_Class operator+ (const Binary_Class&) const; 
} 
class Binary_Class_Extended: public Binary_Class 
{ 
    // weird functions 

} 

Когда я пытаюсь, чтобы все объекты Binary_Class_Extended эта ошибка появляется: main.cpp:285: error: no match for 'operator=' in 'sd = ((Binary_Class*)(&sa))->Binary_Class::operator+(((const Binary_Class&)((const Binary_Class*)((Binary_Class*)(&sb)))))'

Binary_ET_Class sa,sb,sc;

sc=sa+sb // инициализируется sa и sb непредставленных нулевое значение;

полный исходный код, который я работал на: http://pastebin.com/eiVz0f5p

+0

Пожалуйста, используйте правильную капитализацию. – Antimony

+0

Ах, спасибо за исправление сообщения. Мой разум не был сосредоточен на том, что в то время, извините. – Luong

ответ

2

Унаследованные функции сохраняют отпечатки пальцев, поэтому, если оператор Binary_Class + был унаследован, это возвращаемое значение будет ...?

+0

А, какой простой ответ. Я думаю, что я относился к так называемому оператору по-разному. Они просто функционируют правильно? Итак, если я хочу сохранить функцию этого оператора +, я напишу один в новом классе, не так ли? – Luong

+0

Да - еще одна вещь произошла со мной; ваш оператор + не является константой, и, вероятно, это должно быть - оператор «+» используется для «x = a + b», но используется для a и b, а не для x. Поэтому вы, вероятно, хотите 'const Binary_Class & operator + (const Binary_Class & src) const;'. См. Http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html. Ваш Binary_Class_Extended может убить двух птиц одним камнем, определив его как 'const Binary_Class_Extended & operator + (const Binary_Class & rhs) const;' и позволяя ему брать базовый класс, а не производный класс. – kfsone

+0

oh ive сталкивается с тем, что выложено и читает это тоже, но пропустил последний 'const' после скобки. это ошибка, когда все из Binary_Class_Extended, и я не переопределяю = и + оператор этого класса, иначе оператор = ошибка, упомянутая в вопросе: 'main.cpp: 285: error: no match for 'operator =' in 'sd = ((Binary_Class *) (& sa)) -> Binary_Class :: operator + (((const Binary_Class &) ((const Binary_Class *) ((Binary_Class *) (& sb))))' ' – Luong

1

В общем, наследование и назначение («значение семантики») не легко смешивать в C++. Во втором случае «a + b» вернет экземпляр базового слоя, если вы не определите оператор разделителя + для производного класса. Затем результат присваивается только части базового класса «c», которая вызывает ошибку. Это также иногда вызывает нарезку/усечение. Обратите внимание, что выбор оператора во время компиляции не вызывает виртуальных функций, поэтому статический тип должен совпадать.

Не смешивайте типы значений и полиморфные типы. Если вам действительно нужно, и у вас есть фиксированная и известная иерархия, вы можете использовать «Идиома дескриптора тела» для сохранения производной информации при назначении базовому классу. Однако это не новичок.

+0

О, так они не переносят оператора к ребенку? Я думаю, что новый класс «наследует» все блага базового класса, и если я не переопределяю оператор +, то функция останется прежней, измените класс только с «Binary_Class» на «Binary_Class_Extended». Цель нового класса - расширить функциональность базового класса, предоставив ему дополнительные функции, но я думаю, что я не смог этого добиться, потому что исходные функции (например, оператор +) потеряны (не могут выполняться в новом классе). – Luong

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