C++ 使用基类C+的虚方法+;儿童班的孩子

C++ 使用基类C+的虚方法+;儿童班的孩子,c++,virtual,C++,Virtual,我创建了一个名为“Device”的类,该类由多个设备继承(例如,RFDevice、Accelerodevice) 设备类继承了一个线程类。此Threadclass包含一个名为run的纯虚拟函数。是否可以在RFDevice或AcelleroDevice中访问此纯虚拟函数 所以 ThreadClass->DeviceClass->RFDeviceClass 我试着补充一下 “虚拟无效运行(无效)=0”也在设备类中,但这不起作用 仅当虚拟函数不是私有函数时,才进行问候。。如果是,则您不能调用它,也不应

我创建了一个名为“Device”的类,该类由多个设备继承(例如,RFDevice、Accelerodevice)

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

所以

ThreadClass->DeviceClass->RFDeviceClass

我试着补充一下

“虚拟无效运行(无效)=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();
}

如果您不只是维护遗留代码库,那么您可能应该放弃thread类并使用。

是的,如果其中一个类实际提供了实现,那么这是可能的。如果没有看到您尝试过的内容,很难知道它为什么不起作用。您能否发布实际代码,而不是试图描述它?请创建一个示例并向我们展示。密码说了一千多个字。谢谢!这就是我要找的;)为什么声明一个受保护的或公共的虚拟函数不是一个正确的方法?@ReinierHasper:Herb Sutter的这篇老文章仍然是解决这个问题的一个很好的资源:。基本上,公共虚拟函数的问题在于它们将客户机关注点与实现关注点混合在一起。