您的位置:首页 > 编程语言 > C语言/C++

C++复习要点总结十一——多态(二)

2016-04-06 20:40 411 查看

一 构造函数中能调用虚函数,实现多态吗

1)对象中的VPTR指针什么时候被初始化?

对象在创建的时,由编译器对VPTR指针进行初始化

只有当对象的构造完全结束后VPTR的指向才最终确定

父类对象的VPTR指向父类虚函数表

子类对象的VPTR指向子类虚函数表

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 ;

}



二 父类指针步长和子类指针步长不一致时

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 ;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: