从非派生代码调用基本方法,可以吗?合法的?

麦德森

我完全知道,我将向您展示的语法是一种机制,用于从派生类中调用例如基类方法。但是在我遇到的某些代码中,在类实现之外使用了相同的语法,并且我想知道这是否是合法的(从标准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?
    ...
戈尔皮克

合法,是的,但是它显示出严重的设计错误。一个类(Derived在这种情况下,该类)应该提供完整的接口,无论是特定的还是继承的,都不应强迫其调用者深入研究其内胆。如果的客户Derived需要合理地调用Base::method而不是Derived::methodDerived则应提供一个公共方法来提供该功能:

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

当然,如果您真的需要调用Base::method并且不能更改Derived(旧版代码或设计不正确的外部库),则除了使用该技巧之外,别无选择。

总结并回答您的特定问题:是的,这是法律构想,是的,其行为已得到明确定义。但是重新设计Derived会更好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在汇编期间执行非副作用代码可以吗?

在视图Rails中调用ActiveRecord方法可以吗?

从shouldComponentUpdate内调用setState可以吗?

在setInterval()之前调用clearInterval()可以吗?

使用可以吗?每个方法

非数组对象类型的单末尾指针可以吗?

非易失性双重检查锁定,可以吗?

用JavaScript编写HTML代码可以吗?

在 Django 模板的下面代码中添加斜杠可以吗?

这个打开/关闭JDBC连接代码可以吗?

JavaScript中的静态方法可以调用非静态方法吗

从Android Service onStartCommand()中调用stopSelf()可以吗?

在 make 调用中使用 BUILD_MODE 可以吗?

在React的子组件上调用setState可以吗?

在 redux 中使用 reducer 进行后端调用可以吗?

在调用va_end之前,longjmp可以吗?

从析构函数调用非成员函数可以吗?

经常在ObjectOutputStream上调用reset()可以吗?

Laravel DI:在不传递注入变量的情况下调用控制器方法,可以吗?

当从派生的直接对象中以非重写基本方法间接调用虚拟方法时,是否执行vtable查找?

调用派生类的非继承方法

覆盖ActiveRecord关系的count()方法可以吗?

Scrapy 的 request_fingerprint 方法返回 None 可以吗?

使用mixins来实现抽象方法可以吗?

具有与声明的属性同名的方法变量可以吗?

在基类上有虚拟异步方法可以吗?

将类的属性及其确定方法分开可以吗?

这种应用内容安全策略的方法可以吗?

在最终等待之前从异步方法返回可以吗?