我正在学习动态转换并搜索了很多网站,我得出的结论是动态转换可以从基础转换为派生并派生到基础。
但是,当我从 Base 进行强制转换以派生时,它会出现分段错误。
这是代码:
我期望从“A”中得到一个,但即使在铸造之后它也给了我一个“D”
class A
{
public:
virtual ~A(){}
virtual void print()
{
std::cout << "from A"<<std::endl;
}
};
class B: virtual public A
{
public:
void print()
{
std::cout << "from B"<<std::endl;
}
};
class C: virtual public A
{
public:
void print()
{
std::cout << "from C"<<std::endl;
}
};
class D: public B, public C
{
public:
void print()
{
std::cout << "from D"<<std::endl;
}
};
int main(){
A* b = new B;
A* c = new C;
A* d = new D;
A* a = new A;
B* down = dynamic_cast<B*>(a); // this gives me problem
down->print();
A* up= dynamic_cast<A*>(d); // upcasten dont print from A either
up->print();
使用时dynamic_cast
要转换指针,您需要在访问结果指针之前检查其转换是否有效。访问无效指针会导致未定义的行为。
B* down = dynamic_cast<B*>(a);
if (down == 0) {
std::cerr << "a is not a B!\n";
} else {
down->print();
}
您不需要使用dynamic_cast
用于“向上铸造”。您可以将派生分配给父级。如果关系不存在,您将收到编译时错误。
A* up= d;
up->print();
Since print
是一个虚方法,up->print()
解决派生的实施。但是,如果您希望查看基础的实现,您可以显式调用它。
d->A::print();
在线尝试一下! https://tio.run/##rZHRaoMwFIbv8xRn7kZLhV1HKxh9jMFIk3QENAYTW0Zxr@6iia3QDcZYIBA@zn@@H2Vap@@MTc9SsWbgAnLZGdsL2hYTa6gxUKIrAtDDsZEMu9dZ9nagDXyWcXIdYUPOneSge6lsnDg8xwCM5RizbrCQ5xCd@q6FMsrzBQvFm8xNjfPNkPcRfN/orQ8V4Ncq8qgaM/An@Cr8f7rqZ12w1Xi1kP36qv7sq7/zIYRcEFoqlftDS7TcwREOoMQFSLYSFkh1IzyQ@kZoIKXbOiPihrqLcpR/KNpK9saosTnZFTFNfEqeIPYzB3hJQvd7f9H3S38K0oDqrFOQp1cV@fAIojFiE5o3pUX4FGEGre0G7Xp4OOjN1EJ4WpQY39g4TV8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)