Пример кода вопроса, когда я пишу это:
class TestA
{
public:
const TestA &operator=(const int A){return *this;}
};
class TestB : public TestA
{
public:
//Inheritance?
};
Q1: «Является ли оператор присваивания (или любой другой оператор) унаследованным?»
Да, конечно.Единственными функциями-членами, которые не наследуются в C ++ 98, являются конструкторы.Однако реализации базового класса по умолчанию скрыты автоматически сгенерированным оператором copy assignment .Пример:
#include <iostream>
using namespace std;
class TestA
{
public:
TestA const& operator=( int const )
{
cout << "TestA = int" << endl;
return *this;
}
};
class TestB : public TestA
{
public:
// Automatically generated copy assignment operator.
};
int main()
{
TestB o;
cout << "Calling automatically generated copy assignment:" << endl;
cout << "(should be nothing here ->) "; o = TestB();
cout << endl;
cout << endl;
cout << "Calling base class assignment operator:" << endl;
// o = 42; // won't compile, because it's hidden.
cout << "(should be output here ->) "; o.TestA::operator=( 42 ); // OK.
cout << endl;
}
Учитывая все ответы, которые до сих пор путали скрытие и наследование, и просто прояснить терминологию здесь, N3290 (которая идентична стандарту C ++ 11), говорит это:
N3290 §10 / 2:
«Унаследованные члены могут упоминаться в выражениях так же, как и другие члены производного класса, если только их имена не являются скрытыми илинеоднозначный "
В приведенном выше примере код TestA::operator=
скрыт, но см. ответ на вопрос Q3.
Q2: Допустимо ли следующее?
Этот вопросотносится к использованию using
в производном классе, например
class TestB : public TestA
{
public:
using TestA::operator=;
//Inheritance?
};
Да, это действительно.
Это не будет допустимо в C ++ 98 для конструктора, потому что конструкторыне наследуются.
Q3: Если оно действительно, изменится ли оно?
Да, это делает оператор (ы) назначения базового класса напрямую доступным в производном классе.
Например, вы можете удалить комментирование на экзаменеСм. выше,
// o = 42; // won't compile, because it's hidden.
, и он все равно будет компилироваться,
o = 42; // compiles fine with "using".
Приветствия & hth.,