能力值:
( LV15,RANK:1057 )
|
-
-
2 楼
虚函数的特性是让父类能够调用子类的函数,但是如果在父类的构造函数调用子类虚函数的话,结果肯定会出乎意料,所以构造时候编译器会重写虚表,调用自己的虚函数,特性消失==防止错误调用子类虚函数
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
感谢讲解了.不过有个疑问
"虚函数的特性是让父类能够调用子类的函数"
能够让子类调用父类,还是父类调用子类的函数? 应该是父类实现虚函数,子类调用父类的虚函数吧?
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
你在父类中定义了一个虚函数但是不实现它,比如:
class A
{
public:
virtual DWORD GetTaskState(){}; // 定义虚函数,但是不实现函数
}
然后你再子类中实现虚函数,例如:
class B : public A
{
public:
DWORD m_dwState;
DWORD GetTaskState(){return m_dwState;} // 定义和实现父类中的虚函数
}
之后如果可以通过A类访问B的GetTaskState(),例如:
A *p = (A*)new B;
DWORD dwState = p->GetTaskState();
我不是道你指的是不是这个意思,但是有这个用法。
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
感谢楼上的回复,其实在反汇编下面,看了一下,
A *p = (A*)new B;
DWORD dwState = p->GetTaskState();
这样其实,还是通过子类的对象指针,然后获得子类的vtable
然后 call [vtable] 是调用的子类函数
还有一点.貌似.有返回类型的虚函数, 虚函数本身,必须也有返回吧.-_-不然能编译通过吗?
|
|
|