如何在 c++ 中使用虚拟类从其他类调用方法

How to use virtual class in c++ to call method from other class?

本文关键字:其他 调用 方法 虚拟 c++      更新时间:2023-10-16

我正在尝试使用虚拟类从另一个类中的一个类调用方法。我尝试了几种实例化虚拟类的方法,但总是出现一些错误,我做错了什么?这是三个代码片段。

我正在尝试使用虚拟类 SimData.h:

#ifndef SIMDATA_H_
#define SIMDATA_H_
class SimData
{
public:
virtual void onSimUpdate(int id)=0;
};
#endif /* SIMDATA_H_ */

从 maintask.h 调用函数

...
class maintask : public SimData
{
public:
     virtual void onSimUpdate(int id);
...

在另一个类中选择.cpp

.....
SimData* dat;
dat->onSimUpdate(value1); --->HERE IS THE ERROR THAT IT IS NOT INITIALIZED
.....

你知道我如何在 Select.cpp 文件中正确调用抽象类吗?

谢谢。

你有一个指向SimData的指针。您需要使其指向一个实例。例如

SimData* dat;
maintask m;
dat = &m; // dat now points to m
dat->onSimUpdate(value1); // OK now

请注意,调用 new maintask() 将生成指向可分配给 datmaintask的指针。我没有使用过这个例子,因为动态分配和通过指针的多态性是两个独立的问题。此外,处理原始new指针充满了危险。

下面是一个更现实的例子,仍然没有动态分配,甚至没有指针:

void foo(SimData& data, int x) { dat.onSimUpdate(x); }
maintask m;
foo(m, 42);
SimData* dat;
dat->onSimUpdate(value1);

在上面的代码中,它与虚函数无关,而与您从未初始化指针的事实有关(它指向永不登陆)。 您必须将其分配给某些内容:

SimData* dat = new maintask;
dat->onSimUpdate(value1); // this will now work
// NOTE:  you need to delete dat at some point!

使用智能指针代替原始指针:

std::unique_ptr<SimData> dat(new maintask());
dat->onSimUpdate(value1);
// deletion will happen automatically; no need to do it yourself

如果可用,请首选std::make_unique(如果没有,请查找)。

与智能指针不同,原始指针有三个主要问题:

  • 它们需要手动内存管理,导致代码不可维护和不可读。
  • 它们使代码异常不安全,因为在newdelete调用之间可能发生异常。
  • 它们导致语义不明确:哪些指针应该与delete一起使用,哪些不应该?
相关文章: