动态强制转换指向引用的指针和指向指针的引用

Dynamic casting pointer to Reference and reference to pointer

本文关键字:引用 指针 转换 动态      更新时间:2023-10-16

我是CPP的新手,正在尝试学习动态铸造。不幸的是,我收到以下错误

main.cpp: In function 'void PRINT(A&)':
main.cpp:30:40: error: cannot dynamic_cast 'Ref_A' (of type 'class A') to type 'class B*' (source is not a pointer) B *Ref_PTR = dynamic_cast<B*>(Ref_A);

如果有人能教我,这是怎么回事?

我们可以将引用转换为指针或指针转换为引用吗?我们可以只将基本引用转换为派生引用吗?我们可以只将基本指针转换为派生指针吗?

====

============================================================================
#include <iostream>
#include <exception>
#include <typeinfo>
using namespace std;
class A {
public:
  virtual void dummy() {cout<< "Am in Base Class n"; }
};
class B : public A {
public:
  virtual void dummy() {cout<< "Am in first Derived Class n"; }
};
class C : public B {
public:
  virtual void dummy() {cout<< "Am in second Derived Class n"; }
};
void PRINT(A &);
int  main()
{
   B b;
   C c;
   PRINT(b);
   PRINT(c);
   return 0;
}
void PRINT(A &Ref_A )
{
    try
    {
        B &Ref = dynamic_cast<B&>(Ref_A);
        Ref.dummy();
    }
    catch(std::bad_cast exp) { std::cout<<"Caught bad cast in the Second catch n"; }
    B *Ref_PTR = dynamic_cast<B*>(Ref_A);
    if (Ref_PTR)
     Ref_PTR->dummy();
    //Ref_A.dummy();
}

我们可以将引用转换为指针或指针转换为引用吗?

不。引用和指针是C++型生态系统中的不同野兽。

我们可以只将基本引用转换为派生引用吗? 我们可以只将基本指针转换为派生指针吗?

一般是的。我们将引用转换为引用或将指针转换为指针。但这并不是说我们不能从引用中获取指针。这就是地址运算符的用途:

B *Ref_PTR = dynamic_cast<B*>( &Ref_A );

来自 expr.dynamic.cast#1

表达式 dynamic_­cast<T>(v) 的结果是 将表达式 v 转换为类型 T.T 应为指针或 引用完整的类类型,或"指向 cv void 的指针">

在您的代码void PRINT(A &Ref_A )中,

B &Ref = dynamic_cast<B&>(Ref_A);

Ref_A 是一个引用,您希望将其强制转换为引用B&。这将导致bad_­cast根据expr.dynamic.cast#9

请改为执行以下操作:

B *b = dynamic_cast<B*>(&Ref_A); // cast to B*

你可以这样做。

B *Ref_PTR = dynamic_cast<B*>(&Ref_A);

但这是非常糟糕的,你的类将dummy()定义为虚拟的,所以你不应该在没有充分理由的情况下从基类强制转换为派生类。

你可以只使用Ref_A.dummy();它会调用正确的实现