C++ 动态转换指向引用的指针和指向指针的引用

C++ 动态转换指向引用的指针和指向指针的引用,c++,dynamic,casting,C++,Dynamic,Casting,我是CPP的新手,正在努力学习动态铸造。不幸的是,我得到以下错误 main.cpp:在函数“作废打印(A&)”中: main.cpp:30:40:错误:无法将'Ref_A'(类型'class A')动态转换为'class B*'(源不是指针)B*Ref_PTR=dynamic_cast(Ref_A); 如果有人能教我,这是怎么回事 我们可以将引用转换为指针还是指针转换为引用? 我们可以只将基引用转换为派生引用吗? 我们可以只将基指针强制转换为派生指针吗 ====================

我是CPP的新手,正在努力学习动态铸造。不幸的是,我得到以下错误

main.cpp:在函数“作废打印(A&)”中:
main.cpp:30:40:错误:无法将'Ref_A'(类型'class A')动态转换为'class B*'(源不是指针)B*Ref_PTR=dynamic_cast(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();
}
#包括
#包括
#包括
使用名称空间std;
甲级{
公众:
虚拟空虚拟对象(){cout

我们可以将引用转换为指针还是指针转换为引用

在C++生态系统中,一个引用和一个指针是不同的动物。< /P> 我们可以只将基引用转换为派生引用吗? 我们可以只将基指针强制转换为派生指针吗

通常是的。我们将引用转换为引用或指针转换为指针。但这并不是说我们无法从引用中获取指针。这就是运算符的地址:

B *Ref_PTR = dynamic_cast<B*>( &Ref_A );
B*Ref\u PTR=dynamic\u cast(&Ref\u A);
您可以这样做

B *Ref_PTR = dynamic_cast<B*>(&Ref_A);
B*Ref\u PTR=dynamic\u cast(&Ref\u A);
但这是非常糟糕的,您的类将
dummy()
定义为虚拟类,因此您不应该在没有很好的理由的情况下从基类强制转换为派生类

您可以只使用
Ref_A.dummy();
,它将从

表达式
动态广播(v)
的结果是 将表达式v转换为类型T.T应为指针或 对完整类类型的引用,或“指向cv void的指针”

在代码
无效打印(A&Ref\u A)


“我们可以将引用转换为指针还是指针转换为引用?”不,这就是的地址和间接运算符的用途。Ref_A是通过引用传递的,但这并不意味着它是指针。错误实际上表示相同的“源不是指针”为什么不只执行Ref_A.dummy()?该函数是虚拟的。无论如何,我编辑了您的代码,使其更易于阅读。如果您对它有强烈的感觉,请回滚。我认为我们可以执行下面的强制转换派生的*p=dynamic\u cast(Base&)。这是正确的还是错误的?这是代码中的语法(&Ref\u a)*Ref\u PTR=dynamic\u cast(&Ref\u a);要从引用中获取指针?@PrasathShanmugakani是。获取引用地址将返回指向被引用对象的指针。
B &Ref = dynamic_cast<B&>(Ref_A);
B *b = dynamic_cast<B*>(&Ref_A); // cast to B*