以下代码抛出std :: bad_cast
struct Foo {
void foo () {}
};
struct Bar {
Bar () {
dynamic_cast <Foo &> (*this) .foo ();
}
virtual ~ Bar () {}
};
struct Baz : public Foo, public Bar {
};
int main ()
{
Baz b;
}
Run Code Online (Sandbox Code Playgroud)
我记得曾经读过dynamic_cast如何进行实现性能权衡,因为"它遍历了完整的继承格"以便正确评估.编译器在这里需要做的是先强制然后再次向下.
可以进行上述工作还是需要添加
virtual Foo* Bar::as_foo()=0;
?
在没有任何虚函数的类层次结构中,它将dynamic_cast表现为一个简单的,static_cast因为它没有为RTTI存储任何信息,否则会出错?
class CBase { };
class CDerived: public CBase { };
CBase b;
CBase* pb;
CDerived d;
CDerived* pd;
pb = dynamic_cast<CBase*>(&d); // ok: derived-to-base
pd = dynamic_cast<CDerived*>(&b); // wrong: base-to-derived
Run Code Online (Sandbox Code Playgroud)
我知道"衍生的基础"演员是错误的.但它的内在原因是什么?内在的逻辑原因是什么?我想,如果没有更多的解释,很难记住这一点.谢谢!
我在动态转换下面的代码时遇到错误.
class CBase
{
};
class CDerived: public CBase
{
};
main()
{
CBase b;
CDerived* pd;
pd = dynamic_cast<CDerived*>(&b);
}
Run Code Online (Sandbox Code Playgroud)
错误代码是 :error C2683: 'dynamic_cast' : 'CBase' is not a polymorphic type.
请遵守以下代码.据我所知,dynamic_cast比static_cast慢.因为它在运行时评估类型.我在这里的疑问是,如果我们将static_cast与typeid()一起使用如下,它是否需要与动态强制转换相同的时间?它会比dynamic_cast快吗?
class Shape
{
public:
virtual ~Shape(){}
};
class Circle : public Shape{ };
class Square : public Shape{ };
Run Code Online (Sandbox Code Playgroud)
使用RTTI进行静态转换:
Circle c;
Shape* s = &c; // Upcast: normal and OK
// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)
Circle* cp = 0;
Square* sp = 0;
// Static Navigation of class hierarchies
// requires extra type information:
if(typeid(s) == typeid(cp)) // C++ RTTI …Run Code Online (Sandbox Code Playgroud) 考虑class D从a class B和a的sb实例派生std::shared_ptr<B>.一旦我确认了dynamic_cast<D*>(sb.get())可能,我想std::shared_ptr<D>从某人那里创建一个合适的.换句话说,我想dynami_cast<>在shared_ptr之间实现一种.我怎么能以干净的方式做到这一点?一种可能的解决方案是使B 从(铸造)指针派生std::enable_shared_from_this并使用.但这需要改变B类的定义.是否有更好的想法?有什么吗?shared_from_this()Dboost
我在c ++中经历了dynamic_cast概念.
假设我们有一个dynamic_cast和2个派生类class Base,class D1它们派生自class D2
Class Base,它有一个虚函数Base.
我的问题是:
1.upcast和downcast都可以在dynamic_cast中完成吗?
2.如果是,哪一个更优先,更有利.在这种情况下,我们可以在这方面进行贬低/上调?
3.是否推荐任何演员表或有害?
请在考虑上述情况的情况下解释相同的用例,以便对此有更清晰的了解.任何明确的解释都会非常有用.
提前致谢.
说我有这些课程:
struct Parent {};
struct Child : public Parent {
void func() {}
};
Run Code Online (Sandbox Code Playgroud)
现在说我想创建一个这样的函数:
void foo(Parent* arg) {
auto child = dynamic_cast<Child*>(arg);
if(child != nullptr) child->func();
}
Run Code Online (Sandbox Code Playgroud)
但显然这显然会给我错误:
dynamic_cast:Parent不是多态类型
所以我不能做这dynamic_cast一步,是否有一种方法可以验证arg实际上是Child*在运行时?
我目前正在同一个类中用c ++实现不同的opencv机器学习工具.因此,我遇到了将超类的指针向下转换cv::ml::StatModel为子类的问题cv::ml::SVM(例如).
在在线教程中,人们通常会发现opencv分类器的实现,如下所示:
cv::Ptr<cv::ml::SVM> classifier = cv::ml::SVM::create();
Run Code Online (Sandbox Code Playgroud)
我想要做的是在类构造函数中进行动态转换.这是我的类变量的一部分:
class Classifier{
private:
cv::Ptr<cv::ml::StatModel> classifier;
cv::Ptr<cv::ml::SVM> SVM;
//... followed by more code };
Run Code Online (Sandbox Code Playgroud)
在我的构造函数中:
Classifier::Classifier(const char* filename, cv::ml::SVM& svm){
bool load = Classifier::getData(filename);
if (load==0){
cout << "Error opening file!" << endl;
}
else{
classifier = &svm;
//Here I want to do something linke this, just with cv::Ptr:
//the following line gives compiler errors because c++ does not know that cv::Ptr is a pointer...
SVM = dynamic_cast<cv::ml::SVM*>(classifier);
Classifier::setUpSVM(); …Run Code Online (Sandbox Code Playgroud) 引自C++ Primer 5th 19.2.1.dynamic_cast运算符
dynamic_cast具有以下形式:
dynamic_cast<type*>(e)
dynamic_cast<type&>(e)
dynamic_cast<type&&>(e)
Run Code Online (Sandbox Code Playgroud)
其中type必须是类类型,并且(通常)命名具有虚函数的类.在第一种情况下,
e必须是有效的指针(第2.3.2节,第52页); 在第二,e必须是左值; 而在第三,e不能是左值.在所有情况下,类型
e必须是从目标类型公开派生的类类型,目标类型的公共基类,或者与目标类型相同.如果e有这些类型之一,那么演员表会成功.否则,演员表失败.
如果指针类型的dynamic_cast失败,则结果为0.如果对引用类型的dynamic_cast失败,则运算符抛出类型异常bad_cast
但是,我在这里写了一段代码片段:
struct A {};
struct B : private A // note: *private* inheritance
{
A* test() {
return dynamic_cast<A*>(this);
}
};
int main()
{
B b;
if(b.test()==nullptr)
throw 1;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,A它只是一个私有基础B,c ++入门没有考虑到它.但是,此代码段可以编译并运行而不会出错.底漆有错吗?
dynamic-cast ×10
c++ ×9
inheritance ×2
c++11 ×1
casting ×1
constructor ×1
downcast ×1
opencv ×1
pointers ×1
polymorphism ×1
shared-ptr ×1
static-cast ×1
virtual ×1
visual-c++ ×1