Yen*_*nvY 6 c++ polymorphism vtable
这是简单的类定义,如
class Base{
public:
virtual void Func(){
cout<<"Func in Base"<<endl;
}
};
class Derived : public Base{
public:
virtual void Func(){
cout<<"Func in Derived"<<endl;
}
}
Base *b = new Derived();
Run Code Online (Sandbox Code Playgroud)
和声明
(b->*&Base::Func)();
Run Code Online (Sandbox Code Playgroud)
调用Func的派生版本,不同于b-> Base :: Func(),它按预期调用基本版本,为什么会发生这种情况,这个调用的含义到底是什么?
这个电话的意思是增加冗长.基本上:表达式&Base::Func是指向成员函数的指针,并且
(b->*x)()是用于调用由指向x的对象指向的成员函数的语法b.在这种情况下,因为x是一个常数,它与写作大致相同
*&variable.它意味着相同b->Func().
至于为什么它的行为不同b->Base::Func,这是因为它Base::Func是操作&员的操作数,其中Base::有一些不同的作用.如果你写了:
void (Base::*pmf)() = &Base::Func;
Run Code Online (Sandbox Code Playgroud)
并呼吁
(b->*pmf)();
Run Code Online (Sandbox Code Playgroud)
你期望正确调用虚函数.您发布的所有表达式都是用pmf
常量替换变量.
&Base::Func
Run Code Online (Sandbox Code Playgroud)
Func意思是“取其中函数的地址Base”。
由于它是一个虚函数,所以它不是一个简单的函数指针,而是实际上将索引存储到虚函数表中。
然后用 调用它->*,这意味着“取消引用并访问此成员”,您将在 的虚拟表中的该索引处获得该函数b,即版本Derived。所以和 基本上是一样的b->Func()。
为什么有人要这样做?我不知道!
我之前已经解释过一些关于成员函数指针的内容,在这里(带有图片!)。
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |