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类型的处理程序匹配的异常。”谢谢,我将修改我的答案