Maison > développement back-end > Tutoriel C#.Net > C Résumé des points de révision 11 - Polymorphisme (2)

C Résumé des points de révision 11 - Polymorphisme (2)

黄舟
Libérer: 2017-01-16 11:53:36
original
1228 Les gens l'ont consulté

1 Les fonctions virtuelles peuvent-elles être appelées dans le constructeur pour réaliser le polymorphisme ?

1) Quand le pointeur VPTR dans l'objet est-il initialisé ?

Lorsque l'objet est créé, le pointeur VPTR est initialisé par le compilateur

Ce n'est que lorsque la construction de l'objet est complètement terminée que le pointage VPTR est finalement déterminé

Le le pointeur de l'objet de classe parent VPTR pointe vers la table de fonctions virtuelles de la classe parent

Le VPTR de l'objet de sous-classe pointe vers la table de fonctions virtuelles de sous-classe

class Parent
{ public:
Parent(int a=0)//执行时此时的调用的print函数仍然是父类的函数(此时会将vptr指针指向父类的虚函数表)
{
this->a = a;
print();
}
virtual void print() 
{ 
cout<<"我是爹"<<endl; 
}
private:
int a;
};
class Child : public Parent
{ public:
Child(int a = 0, int b=0):Parent(a)//先执行父类构造器,执行完之后返回子类(vprt指针指回子类虚函数表)
{
this->b = b;
print();
}
virtual void print()
{
cout<<"我是儿子"<<endl;
}
private:
int b;
};
void HowToPlay(Parent *base)
{
base->print(); //有多态发生 //2 动手脚 
}
void main()
{
Child c1; //定义一个子类对象 ,在这个过程中,在父类构造函数中调用虚函数print 能发生多态吗?
system("pause");
return ;
}
Copier après la connexion

C Résumé des points de révision 11 - Polymorphisme (2)

Deuxième parent Lorsque la taille du pas du pointeur de classe est incohérente avec la taille du pas du pointeur de sous-classe

class Parent
{
public:
Parent(int a=0)
{
this->a = a;
}
virtual void print() 
{
cout<<"我是爹"<<endl;
}
private:
int a;
};
//成功 ,一次偶然的成功 ,必然的失败更可怕
class Child : public Parent
{
public:
/*
Child(int a = 0, int b=0):Parent(a)
{
this->b = b;
print();
}
*/
Child(int b = 0):Parent(0)
{
//this->b = b;
}
virtual void print()
{
cout<<"我是儿子"<<endl;
}
private:
//int b;
};
void HowToPlay(Parent *base)
{
base->print(); //有多态发生 //2 动手脚 
}
void main()
{
Child c1; //定义一个子类对象 ,在这个过程中,在父类构造函数中调用虚函数print 能发生多态吗?
//c1.print();
Parent *pP = NULL;
Child *pC = NULL;
Child array[] = {Child(1), Child(2), Child(3)};
pP = array;
pC = array;
pP->print();
pC->print(); //多态发生
pP++;
pC++;
pP->print();
pC->print(); //多态发生
pP++;
pC++;
pP->print();
pC->print(); //多态发生
cout<<"hello..."<<endl;
system("pause");
return ;
}
Copier après la connexion

C Résumé des points de révision 11 - Polymorphisme (2)

Ce qui précède est le résumé des points de révision C 11 - Polymorphisme (2) ), veuillez faire attention au site Web PHP chinois (www.php.cn) pour plus de contenu connexe !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal