gpt4 book ai didi

c++ - 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?

转载 作者:行者123 更新时间:2023-12-02 09:50:53 25 4
gpt4 key购买 nike

如果我有一个带有2个派生类AB的基类C,是否有一种简单的方法可以将指针A*转换为B*C*而不知道其真实类型?无需在typeid上进行切换。

最佳答案

关键是:您需要在编译时知道每个变量的类型。因此,您不能拥有使用f并根据A* a指向的对象的实际类型的运行时信息返回B*C*的神奇函数a。即使对于以下示例,也会调用函数B::f,但是返回类型的类型将为A*,因为这是在编译时确定的。

#include <iostream>
struct A {
virtual A* get_ptr() { std::cout << "A!\n"; return this; }
virtual ~A() {}
};

struct B: A {
B* get_ptr() { std::cout << "B!\n"; return this; }
};

void f(A*) { std::cout << "But here A!\n";}

void f(B*) { std::cout << "But here B!\n";}

int main() {
B b;
A* a = &b;
f(a->get_ptr());
}

将打印 B!(因为它是虚拟的),然后调用 A*(因为编译器假定 a->get_ptr()返回 A*)重载。

您可以做的是:
  • 打开存储在与其类型相对应的对象中的枚举。
  • 使用dynamic_cast的尝试和错误。

  • 附录:您可能不需要将指针强制转换为必须具有对象实际类型的对象,因为您可以(如上所述)仅调用虚函数,而这些虚函数将调用属于您实际类型的函数目的。因此,当您认为需要按照描述进行转换时,请三思而后行,您可能将不需要它。

    如果您仍然认为自己需要它,请重新考虑您的设计决策,那么您可能做的事情很奇怪。

    关于c++ - 我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59583975/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com