演示static_cast及其目的?

时间:2016-10-02 06:22:04

标签: c++

我正在尝试理解关于向上转换的static_cast(从孩子到父母)。这对我没有意义。我必须把一个孩子交给父母并进行演示。在线查看一些代码并引用书籍后,这就是我所拥有的。

Mustang *myMustang = new Mustang;
Car *myCar = new Car;

myMustang = static_cast<Mustang*>(myCar);

但坦率地说,它没有显示任何内容。我没有验证它甚至铸造。我试图在Car类中添加一个公共函数,并从子进程中调用它,但是......它显然是继承的。

这也意味着我目前看不到这种向上转型的目的。

我的问题是,我如何验证这个甚至是铸造的?这种输入铸造的目的是什么?

更新:答案有点难以理解,因为我没有这种类型的转换经验,虚拟功能是一个模糊的记忆。我的朋友能够帮助我。以下是其他人有相同问题的代码。

class Car {
  public:
    virtual void Greeting() { cout << "I am a car." << endl; };
};

class Focus : public Car{
  public:
    void FocusGreeting() { cout << "Hello, I am a Ford Focus." << endl; }
};

class Mustang : public Car {
  public:
    virtual void Greeting() override { cout << "I am a Ford Mustang." << endl; } 
};

// in main
Mustang* myMustang = new Mustang;
Car *myCar = new Car;

myCar->Greeting();
cout << "Now ";
myCar = static_cast<Car*>(myMustang);

myCar->Greeting();

2 个答案:

答案 0 :(得分:1)

CRTP模式中的使用示例:

#include <type_traits>
//
// the general concept of being able to accelerate
template<class T>
struct acceleratable
{
  auto accelerate() { 
    static_assert(std::is_base_of<acceleratable<T>, T>::value, "");
    // turn this in to a T, since we know that *this really is a T
    return static_cast<T*>(this)->do_accelerate(); 
  }
};

//
// something that implementes the concept of being able to accelerate
struct car : acceleratable<car>
{
private:
  friend acceleratable<car>;
  void do_accelerate()
  {
    // accelerate implementation here
  }
};

//
// free function which accelerates anything that's acceleratable
template<class Thing>
auto accelerate(Thing& t)
{
  t.accelerate();
}

int main()
{
  car c;
  accelerate(c);
}

答案 1 :(得分:0)

另一个非常重要的使用示例是 type-erasure

class S {
    using FN = void(*)(void*);

    template<typename T>
    static void invoke(void *ptr) {
        static_cast<T*>(ptr)->foo();
    }

public:
    template<typename T>
    static S create(T *t) {
        S s;
        s.ptr = t;
        s.f = &invoke<T>;
        return s;
    }

    void run() {
        f(ptr);
    }

private:
    void *ptr;
    FN f;
};

struct A { void foo() {} };
struct B { void foo() {} };

int main() {
    A a;
    B b;

    S s1 = S::create(&a);
    S s2 = S::create(&b);

    s1.run();
    s2.run();
}