C++ 为什么这在没有静态施法的情况下会失败?

C++ 为什么这在没有静态施法的情况下会失败?,c++,C++,编译f可以工作,但编译g失败并出现错误 为什么会发生这种情况 class A { public: A() {} }; class B : public A { public: B() {} }; void f() { A* a = new A(); B* b = static_cast<B*>(a); } void g() { A* a = new A(); B* b = a; } A类{ 公众: A(){} }; B类:公共A{ 公众: B(){}

编译f可以工作,但编译g失败并出现错误

为什么会发生这种情况

class A {
public:
  A() {}
};

class B : public A {
public:
  B() {}
};

void f() {
  A* a = new A();
  B* b = static_cast<B*>(a);
}

void g() {
  A* a = new A();
  B* b = a;
}
A类{
公众:
A(){}
};
B类:公共A{
公众:
B(){}
};
void f(){
A*A=新的A();
B*B=静态_型铸造(a);
}
void g(){
A*A=新的A();
B*B=a;
}
嗯,是的。做:

B* b = new A();
这是不安全的。最终得到一个指向a对象的B指针;您从不构造对象的B部分;您的对象已“切片”

另一方面

A* a = new B();

…没问题。

您正在尝试将指针从a*转换为B*。我不知道你想达到什么目的。但是因为B*是从A*派生的,而不是从另一个角度,所以这是无效的。也许你想做这样的事情:

int main()
{
///The above code compiles while if I replace above two line in main with below assignment it gives error.
     A *a=new A();
    A * b=new B();

}

基类不能隐式转换为派生类。试想一下这个<
class A {
  public: int x;
};
class B : public A {
  public: int y;
};
B* b = new A; // assume it works, so 4 bytes is allocated and initialized.
b->y;         // bam! accessing unallocated  region.

是的,如果要将基类指定给派生类指针类型,它会给出一个错误。不,如果你明确地抛出指针类型,它不会出错,因为在C++中,如果你愿意,你可以在脚上开枪。
到底是什么让你困惑,或者你希望用你的代码实现什么?

A
static\u cast
强制转换可能不安全

B* b = static_cast<B*>(a);

这里没有强制转换,并且(正确地)不允许从基类指针隐式转换为派生类指针。指向派生类的指针始终可以转换为指向基类的指针,因为派生类对象始终包含基类子对象,但并非每个基类实例都是特定派生类类型的子对象。

请稍等……您10分钟前在此处发布了一个问题……如果没有人响应,则会对此表示不满,不要再贴同样的东西了!投票结束@Tommieb75:这两个问题是不同的。请检查一下,因为我发布了两个不同的Q。如果有任何无意的重复。
static\u cast
告诉编译器“相信我,我知道这实际上是一个B*”。在这种情况下这样做意味着你在对编译器撒谎。你应该在代码本身之前对你的问题做一些解释(同时,有一个有意义的标题也有助于重新打开这个问题。它不是重复的。B*B=new a();doesn compile…而a*a=new a();B*B=static_cast(a);编译..我正在尝试做同样的事情。
B*B=a;
不编译,因为它可能不正确。一般来说,编译器不知道
a
是否实际指向
B
类型的对象,因此它不允许隐式转换。
静态转换是强制转换的一种方法,但它是错误的如果对象不是
B
类型,则执行此操作-尝试使用
B
将给出未定义的行为。对于任何想取消删除此问题的人:我相信它是错误关闭的,然后可能作为噪声删除。用户快速连续发布了两个问题,并且错误地断言它们是重复的如果你阅读了问题的内容,情况就不是这样了。这个问题可能应该结束,但肯定不是因为它与所断言的重复完全相同。
B* b = a;