【问题标题】:use virtual method of base class C++ in child of child class在子类的子类中使用基类 C++ 的虚方法
【发布时间】:2015-03-11 17:14:40
【问题描述】:

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

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

所以,

ThreadClass->DeviceClass->RFDeviceClass.

我已经尝试添加

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

你好,

【问题讨论】:

  • 是的,这是可能的,只要其中一个类实际上提供了实现。如果没有看到您尝试过的内容,很难知道它为什么不起作用。
  • 你能发布实际代码而不是试图描述它吗?
  • 请创建一个Minimal, Complete, and Verifiable Example 并告诉我们。代码说了一千多个字。

标签: c++ virtual


【解决方案1】:

仅当虚函数不是私有的时。如果是,那么您不能调用它,也不应该调用它:

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

【讨论】:

  • 谢谢!这就是我要找的东西;)为什么声明一个受保护的虚函数或公共的虚函数不是正确的方法?
  • @ReinierHasper:Herb Sutter 的这篇旧文章仍然是解决这个问题的好资源:gotw.ca/publications/mill18.htm。基本上,公共虚函数的问题在于它们将客户关注点与实现关注点混合在一起。
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2021-12-25
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多