Этот вопрос - одно из самых больших сомнений, которые витают у меня в голове, и его также трудно описать словами. Иногда это кажется очевидным, а иногда сложно взломать. Итак, вопрос звучит так: ::
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 :))
Прокомментируйте, пожалуйста.
Спасибо за терпение.