首页
社区
课程
招聘
[讨论]关于12章,内存和继承方面的问题
发表于: 2012-12-5 09:41 18225

[讨论]关于12章,内存和继承方面的问题

2012-12-5 09:41
18225
P279页
第一段话.
"父类构造函数会在子类构造函数之前运行,在执行父类构造函数时将虚表指针修改为当前类的续表指针,也就是父类的虚表指针,因此导致虚函数的特性失效"
可是下面一句,我就不明白了。前后矛盾
下面这一句是这么说的
"如果父类构造函数内部存在虚函数调用,这样的顺序能防止在子类中构造父类时,父类会根据虚表错误的调用子类的成员函数."

前面一句刚说,在父类构造函数里面调用虚函数,会导致虚函数的特性消失,这会怎么又变成防止错误调用子类成员函数了?求解答

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 3502
活跃值: (1493)
能力值: ( LV15,RANK:1057 )
在线值:
发帖
回帖
粉丝
2
虚函数的特性是让父类能够调用子类的函数,但是如果在父类的构造函数调用子类虚函数的话,结果肯定会出乎意料,所以构造时候编译器会重写虚表,调用自己的虚函数,特性消失==防止错误调用子类虚函数
2012-12-5 10:01
0
雪    币: 144
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
感谢讲解了.不过有个疑问
"虚函数的特性是让父类能够调用子类的函数"

能够让子类调用父类,还是父类调用子类的函数? 应该是父类实现虚函数,子类调用父类的虚函数吧?
2012-12-5 10:10
0
雪    币: 2155
活跃值: (29)
能力值: ( 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();


我不是道你指的是不是这个意思,但是有这个用法。
2012-12-5 10:56
0
雪    币: 144
活跃值: (42)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
感谢楼上的回复,其实在反汇编下面,看了一下,
A *p = (A*)new B;
DWORD dwState = p->GetTaskState();
这样其实,还是通过子类的对象指针,然后获得子类的vtable
然后 call [vtable] 是调用的子类函数

还有一点.貌似.有返回类型的虚函数, 虚函数本身,必须也有返回吧.-_-不然能编译通过吗?
2012-12-5 12:38
0
游客
登录 | 注册 方可回帖
返回
//