在子类的子节点中使用基类C ++的虚方法

时间:2015-03-11 17:14:41

标签: c++ virtual

我创建了一个名为'Device'的类,它被多个设备继承(例如,RFDevice,AccelleroDevice)

Device类继承了Thread类。此Threadclass包含一个名为run的Pure虚函数。是否可以在RFDevice或AcelleroDevice中访问此纯虚函数。

所以,

ThreadClass-> DeviceClass-> RFDeviceClass

我试图添加

'virtual void run(void)= 0'也在设备类中,但这不起作用。

映入眼帘,

1 个答案:

答案 0 :(得分:0)

仅当虚拟功能不是私有时。如果是,那么你就不能调用它,也不应该这样做:

class ThreadClass
{
public:
    virtual ~ThreadClass() {}
private:
    virtual void run() = 0;
};

class Device : public ThreadClass
{
};

class RFDevice : public Device
{
public:
    void f()
    {
        run(); // compiler error
    }
};

如果它是受保护的或公共的,那么它将起作用,前提是在类层次结构的某个地方有一个函数的实现。但是除了析构函数之外,虚函数应该很少公开或在C ++中受到保护:

class ThreadClass
{
public:
    virtual ~ThreadClass() {}
protected:
    virtual void run() = 0; // non-private virtual, strange
};

class Device : public ThreadClass
{
};

class RFDevice : public Device
{
protected:
    virtual void run()
    {
    }

public:

    void f()
    {
        run(); // works
    }
};

当然,这在技术上并不称为基本功能。这是一件好事;你最终会得到一个纯虚函数调用,而你的程序会崩溃。

您可能需要做的只是实现私有虚拟功能。那将是首选的课程设计:

class ThreadClass
{
public:
    virtual ~ThreadClass() {}
    void execute()
    {
        run();
    }
private:
    virtual void run() = 0;
};

class Device : public ThreadClass
{
};

class RFDevice : public Device
{
private:
    virtual void run()
    {
    }
};

int main()
{
    RFDevice d;
    d.execute();
}

如果您不只是维护遗留代码库,那么您应该摆脱线程类并使用C++11 multi-threading