Разница в расположении памяти указателя на базу и указателя на производный объект - PullRequest
2 голосов
/ 04 августа 2011

Если у меня есть следующие классы:

class A
{
public:
  A(int val) : m_valA(val) {}

private:
   int m_valA;
};

class B : public A
{
public:
  B(int val) : A(0), m_valB(val) {}

private:
  int m_valB;
};


    B* pb = new B;

, если у меня есть функция, которая принимает A *, например:

void func(A* pVal) {}

и pb передается этой функции, тогдас точки зрения низкоуровневой структуры памяти, в чем разница между pval (в функции) и указателем pb?

Разве указатель не указывает на начало объекта?В каком случае оба указателя будут разными?

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Разве указатель не указывает на начало объекта?В каком случае как будут отличаться два указателя?

Если вы передадите указатель на объект B на func(A* pVal), то внутри реализации func() указатель pVal будет указыватьв часть A подобъекта объекта B.Не определено, будут ли они находиться в одном и том же месте (хотя для простой ситуации наследования, как в вашем примере, это почти наверняка будет).

Если подобъект A на самом деле имеет другое смещение (что может потребоваться, например, в случае множественного наследования), тогда компилятор автоматически выполнит соответствующую настройку при компиляции вызова.Компилятор может сделать это, потому что на сайте вызовов он знает, что имеет дело с B*, и ему нужно преобразовать его в A*, чтобы перейти к func().Это безопасное и нормальное преобразование, поскольку B публично наследуется от A.

0 голосов
/ 04 августа 2011
void func(A* pVal) {}

pb повышен до pVal.Он указывает на подобъект базового класса.Однако, если это полиморфный класс, он вызывает переопределенные методы производного класса, если он виртуальный.

pb может обращаться к обоим членам подобъектов в зависимости от уровня доступа.Однако pVal имеет доступ только к элементам подобъектов базового класса.Однако полиморфизм во время выполнения возможен, если базовый класс полиморфен.

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