如何在C++中停止调用不兼容的方法?
How to stop calling incompatible method in C++?
我在处理个人项目时遇到了这个问题。 简而言之,我有 2 个多态类:base
和derived
以及一个函数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();
}
};
相关文章:
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 构造函数采用 Base&不被调用
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载类方法的不明确调用
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 不能调用构造函数
- 为什么我不能调用 onFire();
- 使用不兼容的分配器复制分配无序列图
- 对重载函数find_first_not_of的不明确调用
- 意外的 IConnectionPointImpl::不建议调用 Windows Embedded Compact 7
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 如何在C++中停止调用不兼容的方法?
- C#调用C 第三方DLL(无源)提出异常 - 不兼容PinVoke
- MKDIR 在 C++ 系统调用中失败 - int 类型的参数与 const char* 类型的参数不兼容
- 调用函数时出错:"类型为"int"的参数与类型为"int *"的参数不兼容"
- 表达式:字符串迭代器不兼容,调用"SetDllDirectory"
- 调用指向派生类成员的指针时,指向与对象类型不兼容的成员类型的指针