动态转换指针引用和引用指针

时间:2018-04-12 06:53:48

标签: c++ dynamic casting

我是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);

如果有人可以教我,发生了什么事?

我们可以将引用转换为引用的指针或指针吗? 我们可以仅将基准引用转换为派生参考吗? 我们可以只将Base指针强制转换为派生指针吗?

=============================================== =========================

#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();
}

3 个答案:

答案 0 :(得分:1)

  

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

不。引用和指针是C ++类型生态系统中不同的动物。

  

我们是否可以仅将基础参考转换为派生参考?   我们可以只将Base指针强制转换为派生指针吗?

一般是的。我们转换引用或引用指针的引用。但这并不是说我们无法从引用中获取指针。这就是地址运营商的用途:

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

答案 1 :(得分:1)

你可以这样做。

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

但这很病,你的类将dummy()定义为虚拟,所以你不应该在没有很好的理由的情况下从基类转换为派生类。

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

答案 2 :(得分:1)

来自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&。 根据{{​​3}}

,这将导致bad_­cast

请改为:

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