标签: dynamic-cast

可以动态转换“this”作为返回值吗?

这更多的是一个设计问题。

我有一个模板类,我想根据模板类型向其添加额外的方法。为了实践 DRY 原则,我提出了这个模式(有意省略定义):

template <class T>
class BaseVector: public boost::array<T, 3>
{
protected:
    BaseVector<T>(const T x, const T y, const T z);
public:
    bool operator == (const Vector<T> &other) const;
    Vector<T> operator + (const Vector<T> &other) const;    
    Vector<T> operator - (const Vector<T> &other) const;
    Vector<T> &operator += (const Vector<T> &other)
    {
        (*this)[0] += other[0];
        (*this)[1] += other[1];
        (*this)[2] += other[2];

        return *dynamic_cast<Vector<T> * const>(this);
    }

    virtual ~BaseVector<T>()
    {
    }
}

template <class T>
class Vector : public BaseVector<T>
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates design-patterns dynamic-cast this

4
推荐指数
1
解决办法
2096
查看次数

Shared_ptr std::dynamic_pointer_cast 失败并出现“尝试引用已删除的函数”错误

我已经在 StackOverflow 中看到了有关此类似错误的所有帖子,但仍然找不到导致我的问题的原因。

我用来std::dynamic_pointer_caststd::shared_ptr<Base>对象转换为std::shared_ptr<DerivedShared>对象,但遇到“尝试引用已删除的函数”错误。我已确保Base析构函数是虚拟的,但错误仍然存​​在。

可能是什么原因导致此错误?我该如何解决它?标准库中是否存在任何可能导致此问题的已知限制或错误?任何见解或建议将不胜感激。

PS:我知道它可以工作,static_pointer_cast但想知道是什么导致了问题dynamic_pointer_cast

struct Base
{
    Base() = default;
    virtual ~Base() = default;
    //Copy
    Base(const Base&) = default;
    Base& operator=(const Base&) = default;
    //Move
    Base(Base&&) = default;
    Base& operator=(Base&&) = default;
};


struct DerivedShared : public  Base
{
public:
    DerivedShared() //: data(std::shared_ptr<int[]>(new int[3]{1,2,3}))
    {
        //data = std::make_shared<int[]>(new int[3]{ 1,2,3 });
        data = std::shared_ptr<int[]>(new int[3]{ 1,2,3 });
    }
    
public:
    std::shared_ptr<int[]> data;
};

int main()
{ …
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-cast shared-ptr

4
推荐指数
1
解决办法
489
查看次数

isMemberOfClass vs比较类与==

以下是否有任何真正的区别:

id value;
BOOL compare1 = [value isMemberOfClass:[SomeClass class]];
BOOL compare2 = [value class] == [SomeClass class];
Run Code Online (Sandbox Code Playgroud)

检查是否value是一个SomeClass对象?

cocoa dynamic-cast class objective-c rtti

3
推荐指数
1
解决办法
1235
查看次数

继承和指针指针:为什么它不起作用,我该如何解决它?

当我使用指向继承类的指针调用基类函数时,为什么会出现编译错误?

例:

class cFoo {};
class cBar : public cFoo {};
void func1(cFoo *) {}  // base class
void func2(cFoo **) {}  // base class

void main(void)
{   cBar bar, *pbar;   // inherited class

    func1(&bar);   // compiles OK
    func2(&pbar);  // fail
    func2(dynamic_cast<cFoo**>(&pbar));  // 'class cFoo ** ' : invalid target type for dynamic_cast
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

c++ inheritance pointers dynamic-cast

3
推荐指数
1
解决办法
219
查看次数

堆栈对象的动态转换失败

前几天我遇到了一个实例,我有一个函数,它指向一个基类型,然后我需要向上转换为派生类型以访问一些额外的功能.然而,dynamic_cast失败了,这很奇怪,因为我的类型肯定继承了基类型.

为了了解正在发生的事情的底部,我创建了以下测试程序,我认为它复制了我所看到的:

void cast(TestClass *baseType)
{
    if (dynamic_cast<Derived *>(baseType))
        TRACE("cast was sucessful");
    else
        TRACE("cast failed");
}

int main(int argc, char *argv[])
{
    Derived *test1 = new Derived();
    TestClass *test2 = new TestClass();
    TestClass test3;

    test1->identify(); // prints: this is a Derived class
    test2->identify(); // prints: this is a TestClass

    cast(test1); // succesful
    cast(test2); // fail - expected

    // reassign test2 to test1
    test2 = test1;
    test2->identify(); // prints: this is a Derived class

    cast(test2); // succesful

    // the …
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-cast reference object-slicing

3
推荐指数
1
解决办法
324
查看次数

dynamic_cast vs公开父类中的虚函数(C++)

我有一个父类"base"和另一个继承自"base"的类"derived".

"衍生"有1种方法cH1.

如果我这样做:

base* b = new derived();
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这一点:

b->cH1();
Run Code Online (Sandbox Code Playgroud)

显然我不能和有2个解决方案:

哪一个是更好的做法?

c++ dynamic-cast

3
推荐指数
1
解决办法
336
查看次数

vptr是否位于对象的开头?

根据MSDN,__ RTTynamicCast()函数用于dynamic_cast在Visual C++中实现.其参数LONG VfDelta之一被描述为"对象中虚函数指针的偏移".

AFAIK vptr始终位于对象的起始位置,因此偏移量始终为零.我仔细研究了使用的各种代码片段的反汇编,dynamic_cast我从来没有见过任何东西,只有零被传递代替这个参数.

是否vptr位于任何地方,但物体开始?这种偏移可以是零吗?

c++ dynamic-cast virtual-functions rtti visual-c++

3
推荐指数
1
解决办法
1253
查看次数

不能将dynamic_cast用于const对象

我想编写一个方法,将Base对象指针作为参数传递,并在方法内部将其转换为派生对象指针.

void func( const Base* const obj){
    Derived* der = dynamic_cast<Derived*>(obj);
}
Run Code Online (Sandbox Code Playgroud)

但它显示错误,因为动态强制转换不能抛弃const说明符.但我不明白为什么const必须在这里删除说明符,我所做的只是创建一个派生指针,它应指向指针之后的一些偏移量.我也试过const Derived* const der = dynamic_cast<Derived*>(obj);,但没有结果.

将参数传递为非常重要const.我怎样才能做到这一点?我必须做这件事的第一应用丑陋的方式const_cast,然后dynamic_cast?有没有更好的方法?

c++ dynamic-cast const const-cast

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

动态Cast类在swift中的无条件问题

在我的应用程序中,我有一个包含顶栏和桌子的视图.通过从议程中获取联系人的信息来填充桌面视图.

到目前为止一切正常,但我想从表中选择一个单元格并按下顶部栏上的一个按钮转到另一个视图.不幸的是,这部分根本不起作用.

这是我尝试过的:

class myAgendaTableViewController: UITableViewController ,UINavigationControllerDelegate,ABPeoplePickerNavigationControllerDelegate{
 @IBOutlet var EditButton: UIBarButtonItem!

 @IBOutlet var table: UITableView!


 var objects : NSMutableArray! = NSMutableArray()
 var addressBookController :ABPeoplePickerNavigationController!
 var contactsArray :NSMutableArray! =  NSMutableArray()
 //...........//
 //the method I assigned to the edit button
 @IBAction func pressedEdit(sender: UIBarButtonItem) {
    self.objects.insertObject(NSDate.date(), atIndex: 0)
    var indexPath = NSIndexPath(forRow: 0, inSection: 0)
    var array :NSMutableArray = NSMutableArray()
    var ContactDetailsView : ContactDetails
    ContactDetailsView = self.storyboard.instantiateViewControllerWithIdentifier("Agenda") as ContactDetails
    var personDict = self.contactsArray.objectAtIndex(0) as NSDictionary
    //println(personDict.objectForKey("firstName") ) //the dictionary exists and all …
Run Code Online (Sandbox Code Playgroud)

dynamic-cast uiviewcontroller ios swift

3
推荐指数
1
解决办法
2953
查看次数

什么类型的演员从父母到孩子?

这个问题是关于应该使用哪种C++样式转换进行此转换.我知道C风格的演员可以达到这个目的.

对于以下class结构:

class Foo {};

class Bar : public Foo {};
Run Code Online (Sandbox Code Playgroud)

说我得到了:Foo* ptr;我想把它投射到Bar*我应该使用哪种类型的演员表?好像我必须dynamic_cast按原样使用:

用于转换多态类型

我想避免,dynamic_cast因为它是一个运行时转换.

c++ dynamic-cast casting parent-child reinterpret-cast

3
推荐指数
1
解决办法
1927
查看次数