动态强制转换指向引用的指针和指向指针的引用
Dynamic casting pointer to Reference and reference to pointer
我是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();
它会调用正确的实现
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题