在子类的子类中使用基类C++的虚拟方法
use virtual method of base class C++ in child of child class
我创建了一个名为"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 多线程。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类