C++ 静态强制转换将此对象派生到C++;

C++ 静态强制转换将此对象派生到C++;,c++,derived-class,static-cast,effective-c++,C++,Derived Class,Static Cast,Effective C++,阅读第27项时,在有效的C++中最小化强制转换,它说不要尝试使用静态\u强制转换,以将派生类中的*此强制转换为基类。这是因为static\u cast(*this)将创建基类的临时对象。我尝试了下面的一个例子,但是,它总是使用不同的编译器输出10,比如Clang3.8和GCC4.9、5.3 我错了吗 #include <iostream> class A { public: int a; virtual void foo() {std::cout <

阅读第27项时,在有效的C++中最小化强制转换,它说不要尝试使用
静态\u强制转换
,以将派生类中的
*此
强制转换为基类。这是因为
static\u cast(*this)
将创建基类的临时对象。我尝试了下面的一个例子,但是,它总是使用不同的编译器输出10,比如Clang3.8和GCC4.9、5.3

我错了吗

  #include <iostream>

  class A {
  public:
    int a;
    virtual void foo() {std::cout << a << std::endl;}
  };

  class B : public A {
  public:
    int b;
    void foo ()  { static_cast<A>(*this).foo();}
  };


  int main () {
    B b;
    b.a = 10;
    b.foo();

    return 0;
  }
#包括
甲级{
公众:
INTA;

虚拟void foo(){std::cout首先,您不必强制转换派生->基,因为它是自动发生的。是的,静态\u强制转换将创建您强制转换到的类型的对象。 在您的情况下,要启用多态性,您可以使用引用或指针:

int main(){
    B b;
    A &a = b; // no explicit cast needed
    a.foo(); // will call B::foo

    //OR

    B *bPtr = new B;
    A *aPtr = bPtr; // no explicit cast needed
    aPtr->foo(); // same as above
}

一个更有意义的例子是:

#include <iostream>

class A {
public:
    virtual void foo() { std::cout << "A" << std::endl; }
};

class B : public A {
public:
    virtual void foo() { std::cout << "B" << std::endl; }
    void bar ()  { static_cast<A>(*this).foo(); }
};

int main () {
    B b;
    b.bar();
}
此外,以下一项也如预期的那样起作用(为了清晰起见,在评论中添加了@Verman):

B类:公共A类{
公众:

虚空函数():为什么它不打印10?问题是什么?你想解决的问题是什么?有效C++说STATICE-CAST(*)会创建一个基类的临时对象。所以在这样的假设下,我认为它应该输出0。这是正确的吗?为什么它应该输出0?临时创建的好像是<代码> A(*这个)。。考虑使用哪个构造函数。@谢谢。我现在明白了。实际上,我创建了这个有线例子,并想验证是否创建了一个临时对象。这个例子不适合这个目的。谢谢。实际上,我想创建一个例子来验证StasyType(*this)。将创建一个临时对象。但我自己搞砸了。谢谢。实际上,我想创建一个示例来验证static\u cast(*此)将创建一个临时对象。但我自己搞砸了。答案中的示例实际上创建了一个临时对象。我更喜欢
static\u cast(*此).foo()
而不是
static\u cast(此)->foo()
@vertal Right,它们都按预期工作,我选择了一个作为答案。无论如何,答案已更新。
class B : public A {
public:
    virtual void foo() { std::cout << "B" << std::endl; }
    void bar ()  { static_cast<A*>(this)->foo(); }
};
class B : public A {
public:
    virtual void foo() { std::cout << "B" << std::endl; }
    void bar ()  { static_cast<A&>(*this).foo(); }
};