《C++多态的底层原理和虚函数表的那些事 一》
Posted 程序员Edison
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《C++多态的底层原理和虚函数表的那些事 一》相关的知识,希望对你有一定的参考价值。
class AA
{
public:
virtual void f()
{
cout << "AA::virtual void f()" << endl;
}
virtual void g()
{
cout << "AA::virtual void g()" << endl;
}
virtual void h()
{
cout << "AA::virtual void h()" << endl;
}
virtual void FUNC(){}
private:
int a;
int b;
};
class BB :public AA
{
public:
virtual void f()
{
cout << "BB::virtual void f()" << endl;
}
virtual void g()
{
cout << "BB::virtual void g()" << endl;
}
virtual void h()
{
cout << "BB::virtual void h()" << endl;
}
virtual void FUNC1(){}
private:
int c;
int d;
};
class CC :public AA
{
public:
virtual void f()
{
cout << "CC::virtual void f()" << endl;
}
virtual void g()
{
cout << "CC::virtual void g()" << endl;
}
virtual void h()
{
cout << "CC::virtual void h()" << endl;
}
};
int main()
{
AA *pa = new BB;
AA *pa1 = new CC;
AA *pa2 = new BB;
if (typeid(*pa).name() != typeid(*pa1).name())
{
cout << "pa和pa1不是同一类型的指针"<< endl;
cout << typeid(*pa).name() << endl;
cout << typeid(*pa1).name() << endl;
}
if (typeid(*pa).name() == typeid(*pa2).name())
{
cout << "pa和pa2是同一类型的指针" << endl;
cout << typeid(*pa).name() << endl;
cout << typeid(*pa2).name() << endl;
}
//为什么父类指针转换成子类指针需要强转,而子类转父类可以直接转换?
//因为父类指针访问的内存范围小于子类的指针,如果用一个访问范围大的
//指针指向一块内存地址范围稍小的空间,将会产生不安全的行为。
//因此需要强转。但是反过来却不一样,将子类指针赋值给父类,也就是用
//一个访问范围小的指针指向一块范围较大的内存地址空间,无论如何也不会
//出现指针访问越界的情况,因此是安全的。
BB *pb = dynamic_cast<BB *>(pa);
if (pb)
{
cout << "pa是指向BB类对象内存地址的指针" << endl;
}
CC *pc = dynamic_cast<CC *>(pa1);
if (pc)
{
cout << "pa1是指向CC类对象内存地址的指针" << endl;
}
BB *pb1 = dynamic_cast<BB *>(pa1);
if (pb1 == nullptr)
{
cout << "pa1不是指向BB类对象内存地址的指针" << endl;
}
return 0;
}
AA *pa = new BB;
以上是关于《C++多态的底层原理和虚函数表的那些事 一》的主要内容,如果未能解决你的问题,请参考以下文章