如何在C++中停止调用不兼容的方法?

How to stop calling incompatible method in C++?

本文关键字:不兼容 调用 方法 C++      更新时间:2023-10-16

我在处理个人项目时遇到了这个问题。 简而言之,我有 2 个多态类:basederived以及一个函数caller(),它试图调用derived中存在但不存在于base中的方法。derived类还有一个在该方法中使用的基中不存在的变量。

如果使用类型base *的参数调用caller(),它将失败并显示Segmentation fault,因为它无法在base类中找到方法中使用的变量,如下例所示:

#include <iostream>

class base {
virtual void someFunction() { /* Do something */ }
};

class derived : public base {
public:
void someFunction() override { /* Do something else */ }
void functionNotInBase() {  // Do something base can't
std::cout << variableNotInBase << std::endl;
};
private:
int variableNotInBase {5};
};

void caller(base *p) {
dynamic_cast<derived *>(p)->functionNotInBase();
}

int main() {
auto d = new derived();
auto b = new base();
caller(d);  // Ok, pointer to derived
caller(static_cast<base *>(d));  // Ok, pointer to derived (cast to base)
caller(b);  // Error, classes are not compatible (no variable in base to be printed)
delete b;
delete d;
}

我现在的问题是:如何阻止caller()在不兼容的类型上调用该方法(所有内容不是从derived继承的(?在这种情况下,caller()可能什么都不做,但它不应该因Segmentation fault而失败。

另一个问题是我正在为 Arduino 开发,它没有带有typeid()函数的类型支持库,可以在运行时检查指针类型。

谢谢。

你必须检查dynamic_cast的结果,你目前可以(并且确实(尊重nullptr

void caller(base *p) {
auto der = dynamic_cast<derived *>(p);
if (der) der->functionNotInBase();
}

动态演员是创可贴。切勿在面向对象代码的业务逻辑中使用动态强制转换。如果你认为你需要它,你就有一个设计问题,它会咬你一口。

你有这个逻辑:

if object is derived
call derived method
else
do nothing

此逻辑应移动到基类的虚函数。

class base {
virtual void do_businesst() { }
};
class derived : public base {
void do_business() override {
functionNotInBase();
}
};