>  기사  >  백엔드 개발  >  C++ 검토 핵심 사항 요약 11 - 다형성(2)

C++ 검토 핵심 사항 요약 11 - 다형성(2)

黄舟
黄舟원래의
2017-01-16 11:53:361172검색

1 다형성을 달성하기 위해 생성자에서 가상 함수를 호출할 수 있나요?

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 ;
}

C++ 검토 핵심 사항 요약 11 - 다형성(2)

두 번째 상위 클래스 포인터 단계 크기가 하위 클래스 포인터의 단계 크기와 일치하지 않는 경우

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 ;
}

C++ 검토 핵심 사항 요약 11 - 다형성(2)

위 내용은 요약입니다. C++ 리뷰 포인트 11 - 다형성(2), 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.