我正在尝试理解关于向上转换的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();
答案 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();
}