类实例(对象)点命名空间双冒号非静态函数

问题描述 投票:0回答:1
#include <iostream>
using namespace std;

namespace xyz {
    class Base {
    public:
        bool configure (double a) {
            cout << "Do nothing. a is currently equal to: " << a << endl;
            return true;
        }
        
        virtual bool update(float& a)=0;
   };  
}

class Child : public xyz::Base {
public:
    virtual bool update(float& a) {
        a = a+0.5;
        cout << "Updated" << endl;
        return false;
    }
};

int main() {
    cout << "Hello World" << endl;
    
    Child median;
    float a = 3.0;
    median.update(a);
    median.xyz::Base::configure(a);
    return 0;
}

我想我在这里错过了一些 C++ 概念。

我完全不知道

median.xyz::Base::configure(a);
这句话是怎么回事。这是一个类实例(对象)
median
点命名空间::
xyz
然后:父类
Base
的符号,我只用于静态类方法(但
configure (double a)
甚至不是静态的。 ..).

如何解释这是否有效?

这是来自机器人库的简化 MWE,我对其进行了修改,使其更加通用(https://github.com/ANYbotics/grid_map/blob/master/grid_map_filters/include/grid_map_filters/MedianFillFilter.hpp

c++ inheritance virtual extends
1个回答
0
投票

您在这里看到的是显式调用函数的基类版本。例如,如果您有

namespace xyz {
    
    class Base {
    public:
        bool configure (double a) {
            cout << "Do nothing. a is currently equal to: " << a << endl;
            return true;
        }
        
        virtual bool update(float& a)=0;
   };  
}

class Child : public xyz::Base {
public:
    virtual bool update(float& a) {
        a = a+0.5;
        cout << "Updated" << endl;
        return false;
    }
    bool configure (double a) {
            cout << "In Child::configure. a is currently equal to: " << a << endl;
            return true;
        }
};

int main() {
    cout << "Hello World" << endl;
    
    Child median;
    float a = 3.0;
    median.update(a);
    median.configure(a);
    return 0;
}

然后

median.configure(a);
将打印
In Child::configure. a is currently equal to: 3.5
,因为它正在调用该函数的
Child
版本。通过使用

median.xyz::Base::configure(a);

它将打印

Do nothing. a is currently equal to: 3.5
,因为它现在明确使用该函数的
Base
版本。您可以在此实时示例中看到输出变化。

© www.soinside.com 2019 - 2024. All rights reserved.