Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将派生类强制转换为基类时,动态_强制转换失败 C++第五 class A { public: A() : a(1) {} virtual ~A() = default; private: int a; }; class B : public A { public: B() : b(2) {} private: int b; }; class C : public B { public: C() : c(3) {} private: int c; }; //class D : public B, public A { cause error // public: // D() : d(4) {} // private: // int d; //}; int main() { //A *pa = new C; //B *pb = dynamic_cast<B*>(pa); //1st case B *pb = new B; C *pc = dynamic_cast<C*>(pb); //2nd case cout << pc << endl; //A *pa = new D; //B *pb = dynamic_cast<B*>(pa); //3rd case } //output: 0 cast failure_C++_Inheritance - Fatal编程技术网

将派生类强制转换为基类时,动态_强制转换失败 C++第五 class A { public: A() : a(1) {} virtual ~A() = default; private: int a; }; class B : public A { public: B() : b(2) {} private: int b; }; class C : public B { public: C() : c(3) {} private: int c; }; //class D : public B, public A { cause error // public: // D() : d(4) {} // private: // int d; //}; int main() { //A *pa = new C; //B *pb = dynamic_cast<B*>(pa); //1st case B *pb = new B; C *pc = dynamic_cast<C*>(pb); //2nd case cout << pc << endl; //A *pa = new D; //B *pb = dynamic_cast<B*>(pa); //3rd case } //output: 0 cast failure

将派生类强制转换为基类时,动态_强制转换失败 C++第五 class A { public: A() : a(1) {} virtual ~A() = default; private: int a; }; class B : public A { public: B() : b(2) {} private: int b; }; class C : public B { public: C() : c(3) {} private: int c; }; //class D : public B, public A { cause error // public: // D() : d(4) {} // private: // int d; //}; int main() { //A *pa = new C; //B *pb = dynamic_cast<B*>(pa); //1st case B *pb = new B; C *pc = dynamic_cast<C*>(pb); //2nd case cout << pc << endl; //A *pa = new D; //B *pb = dynamic_cast<B*>(pa); //3rd case } //output: 0 cast failure,c++,inheritance,C++,Inheritance,这个错误是什么意思?在第二个示例中,您创建了一个类B,B是C的基类 所以不能将基类强制转换为某个派生类 这将有助于: B *pb = new C(); C *pc = dynamic_cast<C*>(pb); B*pb=newc(); C*pc=动态铸造(pb); 关于第三个示例D,它派生自B和A,但B也派生自A,这给编译器带来了问题。如果尝试为A派生2次,编译器将不知道要使用哪个函数A、基A或B的派生版本。 艾尔 您应该阅读更多关于基类和派生类的内容 这看起来像是草率的书


这个错误是什么意思?

在第二个示例中,您创建了一个类B,B是C的基类

所以不能将基类强制转换为某个派生类

这将有助于:

 B *pb = new C();
 C *pc = dynamic_cast<C*>(pb);
B*pb=newc();
C*pc=动态铸造(pb);
关于第三个示例D,它派生自B和A,但B也派生自A,这给编译器带来了问题。如果尝试为A派生2次,编译器将不知道要使用哪个函数A、基A或B的派生版本。 艾尔


您应该阅读更多关于基类和派生类的内容

这看起来像是草率的书写——重要的是对象的动态类型,而不是变量的静态类型。(李普曼真的写了吗?)请问一个问题。这篇文章是一堆陈述,但目前没有提出任何问题。@anatolyg添加问题。
D类:公共B,公共a{
是合法的、愚蠢的、无用的继承:你不可能使用或引用第二垒。错误的意思正是它所说的。
D
源于
B
,而
A
源于
A
,因此
D
实际上是通过两条不同的路径从
A
派生而来的是指一个
D
的组合在不同的内存位置包括两个不同的
a
。从
a*
D*
的映射对于每个继承的
a
是不同的,因此从
a*
D*
的任何转换(发生在
a*pa=new D;
)不明确-编译器没有理由选择一种转换方式而不是另一种。如何解释
e是目标类型的公共基类
。我是否误解了这句话。在这种情况下,C是taget类型的公共基类(B)你能指一下你读到的地方吗?我不懂上下文。我在我的问题中显示了一个图像。这是从底漆C++中得到的。
 B *pb = new C();
 C *pc = dynamic_cast<C*>(pb);