Q1: теперь B содержит 1 переопределенный дисплей и 1 унаследованный чистый виртуальный дисплей, верно? Или чисто виртуальный из-за переопределения становится несуществующим.
Ваш первый вопрос здесь не имеет смысла. Класс B
наследует чистый виртуальный от A
и переопределяет его. Он также не «содержит».
A::display()
на самом деле существует как правильно именованная сущность, на которую можно ссылаться в B
. Например, если определено A::display()
;
class A
{
public:
virtual void display()const=0;
};
// yes, defining a pure virtual function is allowed, albeit optional
void A::display() const
{
std::cout << "A!\n";
}
тогда B::display()
может позвонить.
class B:public A
{
public:
void display()const
{
A::display();
std::cout<<"Always"<<endl;
}
};
так что A::display()
и B::display()
существуют в этом случае. Приведенный выше код для B::display()
скомпилируется (поскольку компилятор распознает и A::display()
, и B::display()
как отдельные имена функций) независимо от того, определен A::display()
или нет. (Если A::display()
не определено, компоновщик обычно сообщает об отсутствующем символе).
Q2: Предположим, B переопределил функцию отображения. Теперь, если есть новый класс
class C:public B
{
public:
};
Теперь мне ясно, что все производные классы первого уровня (например, B) должны иметь обязательную силу, чтобы они переопределяли чисто виртуальную функцию (происходящую из класса A), предположим, что они переопределяют ее. что теперь, если существует новый класс C, производный от одного из классов, производных от первого уровня (класс B), потребуется ли ему также переопределить чисто виртуальную функцию (display) или он не потребуется, так как был переопределен в классе B, а C наследует B (следовательно, получил переопределение функции отображения?
Если B
переопределяет display()
, то C
наследует display()
как нечистую виртуальную функцию. Это означает, что если можно создать экземпляр B
, то можно C
.
Если C
не переопределяет унаследованный display()
, тогда some_c->display()
вызовет версию, унаследованную от B
, т.е. B::display()
.
Если C
переопределяет display()
- что разрешено для любой унаследованной виртуальной функции - тогда он может реализовать C::display()
любым необходимым способом.