1、点运算符只能用于类类型的对象,左侧运算对象必须是类类型的对象,右侧运算对象必须是该类型的一个成员名
LocalFrame* GetFrame() const { return frame_.Get(); }
Member<LocalFrame> frame_;
frame_.Get 调用的是Member的Get
2、ptr->mem等价于(*ptr).mem
为简化上述表达式,C++引入->,将解引用与成员访问结合在一起
3、重载箭头运算符
对于形如point->mem的表达式来说,point必须要么是指针(指向类对象),要么是对象(重载了operator->)。
根据point类型不同,point->mem等价于
a)(*point).mem; //point是一个类对象指针
b)point.opreator()->mem; //point是类的一个对象
4、对于重载箭头运算符返回值的约束
必须返回类类型的指针或重载了operator->()的类类型对象
a)返回类型是指针,则内置箭头操作符可用于该指针,编译器对该指针解引用并且从结果对象获取指定成员。
若被指类型没有定义该成员,则编译器报错
b)返回类型是类类型的对象(或这种对象的引用),则递归应用该对象的operator->。
编译器检查返回对象所属类型是否重载了箭头操作符,若有,应用该操作符,直到返回一个指向带有指定成员的对象的指针,否则,编译器报错
class A {
public:
void action() {
cout << "Action in class A" << endl;
}
};
class B {
public:
A* operator->() {
return &a;
}
void action() {
cout << "Action in class B" << endl;
}
private:
A a;
};
class C {
public:
B& operator->() {
return b;
}
void action() {
cout << "Action in class C" << endl;
}
private:
B b;
};
int main() {
C c;
C* pc = &c;
c->action(); //Action in class A
pc->action(); //Action in class C
return 0;
}
///
///
WebViewImpl* WebFrameWidgetImpl::View() const {
return local_root_->ViewImpl();
}
Member<WebLocalFrameImpl> local_root_;
第一步 肯定是调用Member::operator->() 得到WebLocalFrameImpl*
第二步 就看这WebLocalFrameImpl::ViewImpl()是不是virtual了
Type* p;
p->f();
首先要看下f是否是virtual 如果是non virtual 那就是Type::f
如果是virtual 你要看p实际的类型 ,他可能是Type的子类 也可能是Type本身