Низкоуровневые детали наследования и полиморфизма

Этот вопрос - одно из самых больших сомнений, которые витают у меня в голове, и его также трудно описать словами. Иногда это кажется очевидным, а иногда сложно взломать. Итак, вопрос звучит так: ::

class Base{
public:
     int a_number;

     Base(){}
     virtual void function1() {}
     virtual void function2() {}
     void function3() {}
};

class Derived:public Base{
public:
     Derived():Base() {}
     void function1() {cout << "Derived from Base" << endl; 
     virtual void function4() {cout << "Only in derived" << endl;}
};

int main(){

      Derived *der_ptr = new Derived();
      Base *b_ptr = der_ptr;  // As just address is being passed , b_ptr points to derived                object

      b_ptr -> function4(); // Will Give Compilation ERROR!!

      b_ptr -> function1(); // Calls the Derived class overridden method

      return 0;

}

Q1. Хотя b_ptr указывает на производный объект, к какому VTABLE он обращается и КАК? поскольку b_ptr -> function4 () выдает ошибку компиляции. Или b_ptr может получить доступ только к этому размеру базового класса VTABLE в производном VTABLE? Итак, вопрос таков ...

Этот вопрос - одно из самых больших сомнений, которые витают в моей голове, и его также трудно описать словами. Иногда это кажется очевидным, а иногда сложно взломать. Поэтому вопрос звучит так: ::

class Base{
public:
     int a_number;

     Base(){}
     virtual void function1() {}
     virtual void function2() {}
     void function3() {}
};

class Derived:public Base{
public:
     Derived():Base() {}
     void function1() {cout << "Derived from Base" << endl; 
     virtual void function4() {cout << "Only in derived" << endl;}
};

int main(){

      Derived *der_ptr = new Derived();
      Base *b_ptr = der_ptr;  // As just address is being passed , b_ptr points to derived                object

      b_ptr -> function4(); // Will Give Compilation ERROR!!

      b_ptr -> function1(); // Calls the Derived class overridden method

      return 0;

}

Q1. Хотя b_ptr указывает на производный объект, к какому VTABLE он обращается и КАК? поскольку b_ptr -> function4 () выдает ошибку компиляции. Или b_ptr может получить доступ только к этому размеру базового класса VTABLE в производном VTABLE? Итак, вопрос таков ...

Этот вопрос - одно из самых больших сомнений, которые витают в моей голове, и его также трудно описать словами. Иногда это кажется очевидным, а иногда сложно взломать. Поэтому вопрос звучит так: ::

class Base{
public:
     int a_number;

     Base(){}
     virtual void function1() {}
     virtual void function2() {}
     void function3() {}
};

class Derived:public Base{
public:
     Derived():Base() {}
     void function1() {cout << "Derived from Base" << endl; 
     virtual void function4() {cout << "Only in derived" << endl;}
};

int main(){

      Derived *der_ptr = new Derived();
      Base *b_ptr = der_ptr;  // As just address is being passed , b_ptr points to derived                object

      b_ptr -> function4(); // Will Give Compilation ERROR!!

      b_ptr -> function1(); // Calls the Derived class overridden method

      return 0;

}

Q1. Хотя b_ptr указывает на производный объект, к какому VTABLE он обращается и КАК? поскольку b_ptr -> function4 () выдает ошибку компиляции. Или b_ptr может получить доступ только к этому размеру базового класса VTABLE в производном VTABLE?

Q2. Поскольку макет памяти производного класса должен быть (базовый, производный), включен ли VTABLE базового класса в макет памяти производного класса?

Q3. Поскольку function1 и function2 базового класса Vtable указывают на реализацию базового класса, а function2 производного класса указывает на function2 базового класса, действительно ли существует потребность в VTABLE в базовом классе ?? (Это может быть самый глупый вопрос, который я когда-либо мог задать, но все же я сомневаюсь в этом в моем нынешнем состоянии, и ответ должен быть связан с ответом Q1 :))

Прокомментируйте, пожалуйста.

Спасибо за терпение.

6
задан Arunmu 28 December 2010 в 17:56
поделиться