LINUX.ORG.RU

Почему не компилится эта программа


0

0

#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

class A
{
int a_;

public:

virtual ~A(){ }

A():
a_(0)
{
}
virtual int Val()const{return a_; }

virtual A& operator =(const A& a);
virtual A& operator =(int A);
};
A& A::operator =(const A& a)
{
a_=a.Val();
return *this;
}
A& A::operator =(int A)
{
a_=A;
return *this;
}
class B: public A
{
public:

B():
A()
{
}
};

int main()
{
B b;
b=200;
printf("%d\n",b.Val());
return 0;
}


результат:

a.cpp: In function ‘int main()’:
a.cpp:55: error: no match for ‘operator=’ in ‘b = 200’
a.cpp:43: note: candidates are: B& B::operator=(const B&)
make: *** [a] Error 1

Ответ на: комментарий от Legioner

Очень даже наследуются, если объект родительского класса ссылается на экземпляр дочернего, то как раз унаследованный оператор и будет использоваться при сравнении объектов. Только здесь это делу не поможет - перегружать оператор для дочернего класса кто будет? АС Пушкин? :)

cathode
()
Ответ на: комментарий от cathode

Можно пример кода, не понял вашего объяснения. По-моему пример вполне очевидно демонстрирует, что функция
virtual A& operator =(int A);
не унаследовалась.
Если написать явно функцию assign, с параметром типа int, то всё будет работать.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

твое исходное утверждение "операторы не наследуются" слишком категорично и не верно. Не наследуются только те операторы для которых компилятор генерирует дефолтные версии.

(А если в родителе была функция, то если в потомке определяется функция с тем же именем но другой сигнатурой, то она скроет унаследованную от родителя)

dilmah ★★★★★
()
Ответ на: комментарий от Legioner

>Потому что операторы не наследуются.

Вы не правы - см. пункт [13.5.6] Стандарта C++.

>...Operator funtions are inherited in the same manner to other base class functions.

Sectoid ★★★★★
()

Проблема в том что оператор =(/*что-то не являющееся */) _НЕ_НАСЛЕДУЕТСЯ_ Оператор = вообще всегда осообенный.

Если не верите - напишите простейшую программку с таким наследованием, а потом уже пишите, что наследуется а что нет.

Если я не прав - отпишитесь аргументированно пжлст.

Автору: проблему можно решить например <static_cast>'ом. или переопределяйте оператор в наследуемом классе.

teferiincub
()
Ответ на: комментарий от teferiincub

Вообще то можно наследовать operator = следующим образом -

в производном классе обьявить

using A::operator =;

dmitry-vm
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.