#include<iostream>
using namespace std;
class Father
{
public:
int a=99;
void MakeAThing(){ cout<<"MakeAThing of father called"<<endl;}
virtual void MakeAThing2(){ cout<<"MakeAThing2 of father called"<<endl;}
};
class Child : public Father
{
public:
int b=11;
void MakeAThing(){ cout<<"MakeAThing of child called"<<endl;}
virtual void MakeAThing2(){ cout<<"MakeAThing2 of child called"<<endl;}
};
int main(){
Father *obj;
obj = new Child();
obj->MakeAThing();// MakeAThing of Father is called
//code to find out if obj becomes a Child* after new
Father fa
fa=*obj;
cout <<fa.b<<endl; // error: 'Class Father' has no member 'b'
//which means fa remains an object of Class Father
Father *obj2;
obj2 = new Child();
obj2->MakeAThing2();// MakeAThing2 of Child is called
return 1;
}
Кто-нибудь может объяснить, что происходит в главном? Моя попытка:
obj — указатель на объект типа «Отец».
В obj= new Child();
new выделяет память для объекта типа Child и возвращает указатель на void: *void, верно?, так obj преобразуется в тип *void или остается типом *Father? Зачем?
В obj->MakeAThing();
MakeATThing of Father называется, почему?
Почему в obj2->MakeAThing2();
ключевое слово виртуальный заставляет вызов MakeATThing2 относиться к ребенку, а не к отцу?
new Child()
возвращаетChild*
, а неvoid*
- person UnholySheep   schedule 11.12.2019virtual
— предоставить производному классу способ переопределить функциональность базового класса. - person TheUndeadFish   schedule 11.12.2019std::malloc
сnew
? - person Algirdas Preidžius   schedule 11.12.2019operator new
, но он вызывается , за кулисами, по выражениюnew
, которое вы, собственно, здесь и используете. Чтобы узнать о разнице между ними, вы можете дополнительно прочитать здесь: stackoverflow.com/questions/8962467/ - person Algirdas Preidžius   schedule 11.12.2019