我是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();
}
答案 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)
表达式
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*