标签: dynamic-cast

为什么我不能在多重继承期间"侧向"动态广播?

以下代码抛出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;

c++ inheritance constructor dynamic-cast object-lifetime

2
推荐指数
1
解决办法
1209
查看次数

如果没有单个虚函数,dynamic_cast是否表现为static_cast?

在没有任何虚函数的类层次结构中,它将dynamic_cast表现为一个简单的,static_cast因为它没有为RTTI存储任何信息,否则会出错?

c++ dynamic-cast

2
推荐指数
1
解决办法
282
查看次数

c ++ dynamic_cast

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)

我知道"衍生的基础"演员是错误的.但它的内在原因是什么?内在的逻辑原因是什么?我想,如果没有更多的解释,很难记住这一点.谢谢!

c++ dynamic-cast

2
推荐指数
1
解决办法
3066
查看次数

动态投射中的错误

我在动态转换下面的代码时遇到错误.

  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.

c++ dynamic-cast

2
推荐指数
1
解决办法
102
查看次数

static_cast和RTTI vs dynamic_cast

请遵守以下代码.据我所知,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)

c++ dynamic-cast static-cast

2
推荐指数
1
解决办法
3863
查看次数

如何在shared_ptr之间实现类似"dynamic_cast"的运算符?

考虑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

dynamic-cast shared-ptr c++11

2
推荐指数
1
解决办法
194
查看次数

可以使用C++中的dynamic_cast完成上传和下传

我在c ++中经历了dynamic_cast概念.

假设我们有一个dynamic_cast和2个派生类class Base,class D1它们派生自class D2
Class Base,它有一个虚函数Base.
我的问题是:
1.upcast和downcast都可以在dynamic_cast中完成吗?
2.如果是,哪一个更优先,更有利.在这种情况下,我们可以在这方面进行贬低/上调?
3.是否推荐任何演员表或有害?

请在考虑上述情况的情况下解释相同的用例,以便对此有更清晰的了解.任何明确的解释都会非常有用.
提前致谢.

c++ virtual inheritance dynamic-cast visual-c++

2
推荐指数
1
解决办法
2600
查看次数

有什么方法可以在投射到孩子时使用dynamic_cast吗?

说我有这些课程:

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++ polymorphism dynamic-cast downcast

2
推荐指数
2
解决办法
327
查看次数

opencv cv :: Ptr的动态强制转换

我目前正在同一个类中用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++ opencv pointers dynamic-cast casting

2
推荐指数
1
解决办法
898
查看次数

使用`dynamic_cast`时c ++底漆是否有问题?

引自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 ++入门没有考虑到它.但是,此代码段可以编译并运行而不会出错.底漆有错吗?

c++ dynamic-cast access-control private-inheritance

2
推荐指数
2
解决办法
151
查看次数