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

use virtual method of base class C++ in child of child class

本文关键字:子类 C++ 虚拟 方法 基类      更新时间:2023-10-16

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

设备类继承了一个线程类。此线程类包含一个名为 run 的纯虚函数。是否可以在RFDevice或AcelleroDevice中访问此纯虚拟功能。

所以

ThreadClass->DeviceClass->RFDeviceClass.

我尝试添加

'

虚拟无效运行(void) = 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 多线程。