C++ c++;多重继承与铸造
我有以下课程:C++ c++;多重继承与铸造,c++,multiple-inheritance,C++,Multiple Inheritance,我有以下课程: class A { }; class B { public: B(){} virtual ~B(){}; }; class B1 : public B{ public: B1(){} virtual ~B1(){}; }; class B2 : public B{ public: B2(){} virtual ~B2(){}; }; class C1 : public A, public B1{ public: C1(){} virtual ~C1(){}; }; cla
class A { };
class B {
public:
B(){}
virtual ~B(){};
};
class B1 : public B{
public:
B1(){}
virtual ~B1(){};
};
class B2 : public B{
public:
B2(){}
virtual ~B2(){};
};
class C1 : public A, public B1{
public:
C1(){}
virtual ~C1(){};
};
class C2 : public A, public B2{
public:
C2(){}
virtual ~C2(){};
};
我想知道类型B的对象是否也是类型A:
B*b = new C1(); // or new B, or new C2 ...
if(dynamic_cast<A*>(b))
{
...
B*B=new C1();//或者新的B,或者新的C2。。。
if(动态_-cast(b))
{
...
我的dynamic_cast是否正确(它编译并运行)?
谢谢。要能够使用
动态\u cast
对象的所有父对象都需要是多态的。即,您需要向A
类(如析构函数)添加至少一个虚拟函数
<> P> >一旦你修复了,那么你的<代码> DyrimixCase很好。
类A在C++类型系统中不同于B类。因为它们都是空的,它们应该是相同的,但是它们都是在内存中被设置的。即使空类也有身份属性。
dynamic\u cast(expression)
通常用作:dynamic\u cast(myBase)
。在这种情况下,“如果表达式是指向多态类型库的指针或引用,而新类型是指向派生类型的指针或引用,则执行运行时检查:”请参阅cppreference.com search for dynamic_cast。这允许您将基类强制转换回派生类。程序员必须知道派生类存在。我认为您的强制转换无效。因为A和B有共同的子级,并不意味着它们可以被强制转换为另一个。尽管您将其声明为B,但您的B
*代码>是使用new C1()
创建的,因此它是合法的A*
,您的代码将正常工作。如果您尝试new B()
,这将失败。C1
继承自A
,但B
不继承。您说执行if语句的主体是因为所有有效指针都不是零,但如果dynamic_cast()失败,它将返回0,因此他检查结果的方式是合适的。“如果强制转换成功,dynamic_cast将返回一个类型为new_type的值。如果强制转换失败并且new_type是指针类型,它将返回该类型的空指针。如果强制转换失败并且new_type是引用类型,它将抛出一个与std::bad_cast类型的处理程序匹配的异常。”谢谢,我将修改我的答案