使用static_cast来动态多态
Use static_cast to dynamic polymorphism
我用了static_cast来多态。
我读到我应该使用 dynamic_cast,但我不明白为什么。
代码以两种方式工作(静态和动态转换)。
任何人都可以给我一个必要的 dynamic_cast 运算符的例子吗?
class Base
{
public:
virtual void foo() = 0;
};
class D1 : public Base
{
public:
void foo()
{
std::cout << "D1()";
}
};
class D2 : public Base
{
public:
void foo()
{
std::cout << "D2()";
}
};
int main()
{
srand( time( NULL ) );
int r = std::rand()%2;
Base* b_ptr;
if(r == 0)
{
b_ptr = static_cast<Base*>(new D1);
}
else
{
b_ptr = static_cast<Base*>(new D2);
}
b_ptr->foo();
}
不知道你在哪看的。
至于 static_cast
与 dynamic_cast
,那里有很多信息。
我在底部提供了几个链接。
为什么您的代码在这两种情况下都能正常工作?
"up-cast"(强制转换为基数 class)对于 static_cast
和 dynamic_cast
始终有效,并且没有任何强制转换,因为 "up-cast" 是隐式的转换。 (来自 here,例如)
谁能给我一个必要的 dynamic_cast
运算符的例子?
dynamic_cast
专门用于处理多态性。您可以将指向任何多态类型的指针或引用转换为任何其他 class 类型(多态类型至少有一个声明或继承的虚函数)。您不仅可以将它用于向下投掷 - 您还可以向侧面投掷,甚至可以向上投掷另一条链条。 dynamic_cast 将寻找所需的对象,并在可能的情况下 return 找到它。如果不能,它会在指针的情况下 return nullptr
,或者在引用的情况下抛出 std::bad_cast
。
不过,dynamic_cast
有一些限制。如果继承层次结构中有多个相同类型的对象(即所谓的 'dreaded diamond')并且您没有使用虚拟继承,则它不起作用。它也只能通过 public 继承——它总是无法通过受保护或私有继承。然而,这很少成为问题,因为这种形式的继承很少见。 (来自 here,例如)
有关示例,请参阅 this。
奖励:当你不能使用dynamic_cast
?
如果向下转换(转换为派生的 class)并且参数类型不是多态的,则不能使用 dynamic_cast
。
Regular cast vs. static_cast vs. dynamic_cast
When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?
我用了static_cast来多态。 我读到我应该使用 dynamic_cast,但我不明白为什么。 代码以两种方式工作(静态和动态转换)。
任何人都可以给我一个必要的 dynamic_cast 运算符的例子吗?
class Base
{
public:
virtual void foo() = 0;
};
class D1 : public Base
{
public:
void foo()
{
std::cout << "D1()";
}
};
class D2 : public Base
{
public:
void foo()
{
std::cout << "D2()";
}
};
int main()
{
srand( time( NULL ) );
int r = std::rand()%2;
Base* b_ptr;
if(r == 0)
{
b_ptr = static_cast<Base*>(new D1);
}
else
{
b_ptr = static_cast<Base*>(new D2);
}
b_ptr->foo();
}
不知道你在哪看的。
至于 static_cast
与 dynamic_cast
,那里有很多信息。
我在底部提供了几个链接。
为什么您的代码在这两种情况下都能正常工作?
"up-cast"(强制转换为基数 class)对于 static_cast
和 dynamic_cast
始终有效,并且没有任何强制转换,因为 "up-cast" 是隐式的转换。 (来自 here,例如)
谁能给我一个必要的 dynamic_cast
运算符的例子?
dynamic_cast
专门用于处理多态性。您可以将指向任何多态类型的指针或引用转换为任何其他 class 类型(多态类型至少有一个声明或继承的虚函数)。您不仅可以将它用于向下投掷 - 您还可以向侧面投掷,甚至可以向上投掷另一条链条。 dynamic_cast 将寻找所需的对象,并在可能的情况下 return 找到它。如果不能,它会在指针的情况下 return nullptr
,或者在引用的情况下抛出 std::bad_cast
。
不过,dynamic_cast
有一些限制。如果继承层次结构中有多个相同类型的对象(即所谓的 'dreaded diamond')并且您没有使用虚拟继承,则它不起作用。它也只能通过 public 继承——它总是无法通过受保护或私有继承。然而,这很少成为问题,因为这种形式的继承很少见。 (来自 here,例如)
有关示例,请参阅 this。
奖励:当你不能使用dynamic_cast
?
如果向下转换(转换为派生的 class)并且参数类型不是多态的,则不能使用 dynamic_cast
。
Regular cast vs. static_cast vs. dynamic_cast
When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?