class A
{
virtual void printf(){std::cout<<"A"<<std::endl;}
};
class B :public A
{
virtual void printf(){std::cout<<"B"<<std::endl;}
}
我如果不知道 B是子类的情况下,如何调B类的 printf函数;
我感觉不知道应该是不行,那为什么 MFC中,继承一个窗口类,系统就可以调用里面虚函数
这个MFC是通过什么技术实现的
...全文
103514打赏收藏
c++多态调用的问题
class A { virtual void printf(){std::cout<<"A"<<std::endl;} }; class B :public A { virtual void printf(){std::cout<<"B"<<std::endl;} } 我如果不知道 B是子类的情况下,如何调B类的 printf函数; 我感觉不知道应该是不行,那为什么 MFC中,继承一个窗口类,系统就可以调用里面虚函数 这个MFC是通过什么技术实现的
多态的调用就是在不需要知道子类的情况下,可以调用子类的函数。
如果知道了子类,就不需要多态了。
具体的实现是,虚基类有一个虚函数表,所有的虚函数的入口都在这个表里面。
使用虚基类的引用来调用这些函数的时候,通过这个表找到入口地址,在修正过 this 之后,就可以直接呼叫这个入口指向的函数了。
而这个虚函数表在子类实例化的时候(此时需要明确知道子类是谁),被子类的构造函数改写(如果重写虚函数),把自己的重写的函数入口写入这个表。
不是直接的重写函数,而是使用一个转换函数,这个函数负责修正 this 指针。
class A
{
virtual void printf(){std::cout<<"A"<<std::endl;}
};
class B :public A
{
virtual void printf(){std::cout<<"B"<<std::endl;}
}
void aFun()
{
A* pA=new A;
A* pB= new B;
pA->printf();//调用的是A类的函数
pB->printf();//因为pB由B类创建,因此自动的调用B类的函数,这就是多态的魅力,使用者不需要知道是来自什么类,但是会自动的调用合适的函数
}