2015-04-14 23 views
0

我完全知道,我要告诉你的语法是调用例如派生类中的基类方法。但是在我遇到的一些代码中,在类实现之外使用了相同的语法,我想知道这是否是合法的(在标准C++意义上)结构,以及结果行为是否已定义好?从非派生代码调用基本方法,这可能吗?法律?

class Base 
{ 
public: 
    virtual void method(int arg) 
    { 
     ... 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual void method(int arg) 
    { 
     ... 
     Base::method(arg); // I'm fully comfortable with this... 
    } 
}; 


int main(int argc, char* argv[]) 
{ 
    Derived d; 
    Derived* pD = &d; 
    pD->Base::method(2); // is this allowed? 
    ... 
+3

是的,它是允许的。 – Meixner

+0

每次你认为某件事情不应该是合法的,因为它是“错误的”,请记住,在大多数情况下,C++规则是“相信程序员”:如果程序员错了,程序员不会这样做。请记住,如果你真的生气了,你可以对对象实例“memset”:-D ...如果事情不可能不自觉地发生,就没有必要禁止它。 – 6502

回答

3

法律,是的,但它显示了严重的错误设计。在这种情况下,一个类(Derived)应该提供一个完整的接口,不管它是具体的还是继承的,并且不会强迫它的调用者深入研究它的胆量。如果Derived客户可以合理需要调用Base::method而不是Derived::method,然后Derived应该提供一个公共的方法来提供该功能:

void alternateMethod(int arg) {Base::method(arg);} 

当然,如果你真的需要调用Base::method并不能改变Derived(遗留代码或一个设计不好的外部图书馆),你可能别无选择,只能使用该技巧。

总结并回答您的具体问题:是的,这是一个法律框架,是的,它的行为是明确的。但重新设计Derived会好很多。

+0

谢谢你的回答。设计是一回事,但是能够侧开班级的虚拟桌面的能力,却不是我以前见过的。 –

相关问题