В C ++ каждый экземпляр класса имеет свою собственную версию типов данных, но все классы совместно используют одну и ту же функцию в памяти (кроме встроенных функций).В вашем случае, когда вы говорите что-то вроде:
pd->foo();
Вы, по сути, вызываете Derived::foo
, которая является функцией в памяти, и компилятор знает, где она находится.Дело в том, что он вообще не зависит от pd
.Однако, если у вас было что-то вроде этого:
class Derived : public Base {
private:
int a;
public:
Derived() { a = 100; }
void foo() {
std::cout<<a<<std::endl;
}
};
Тогда pd->foo()
вызовет ошибку сегментации.Здесь ваше динамическое приведение не выполнено, и когда вызывается Derived::foo
, ему передается 0
как объект this
.В предыдущем случае все было в порядке, поскольку объект this
никогда не использовался.Однако во втором случае он используется и, следовательно, вызывает ошибку сегментации.