Множественное наследование и указатель "this" приводятся к общему базовому классу - PullRequest
0 голосов
/ 17 февраля 2020

Рассмотрим следующий код:

class Base {
  //some code
};

class A : public virtual Base{
    //some code
};

class B : public virtual Base{
    //some code
};

class C:  public A, public B {
    //some code
}; 

Другими словами, мы имеем множественное наследование, и все классы наследуются от класса Base. Теперь учтите, что указатель «this» существует в коде в классах A, B, C, Base. Я знаю, что в целом мы не можем предполагать, что значение указателя «this» будет одинаковым во всех случаях. Но что это, указатель «this» приводится к классу Base * внутри A, B, C всякий раз, когда он используется. Правильно ли говорить, что приведенный указатель «this» после приведения к общему классу Base * будет содержать один и тот же адрес внутри A, B, C? Спасибо

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Да. Виртуальное наследование означает, что существует только один подобъект базового класса типа Base, который одновременно является подобъектом C, A и B. Преобразование (неявное или приведенное) из указателя на любой из этих типов в Base* или инициализация ссылки Base& из lvalue любого из этих типов заставит компилятор сделать правильный logi c, чтобы найти этот единственный Base подобъект.

0 голосов
/ 17 февраля 2020

Но что это, указатель «this» приводится к классу Base * внутри A, B, C всякий раз, когда он используется

Обратите внимание, что даже нет нужно привести (то есть преобразовать явно). Указатель на производный неявно преобразуется в базовый указатель.

Правильно ли говорить, что приведенный указатель "this" после приведения к общему классу Base * будет содержать то же значение внутри A, B, C?

Указатель не «содержит значения», кроме значения адреса объекта. Объект, адрес которого хранится, является указанным объектом. Указатель на базу указывает на базовый подобъект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...