Dynamic_cast 给出分段错误

问题描述

我知道虚函数和多态是什么。我在理解下面的代码时有点困惑。

class book //your custom class
{
private:
    string author;
    int pages;
public: 
    book(const string &str,int num): author(str),pages(num) {} 
    friend bool pages_compare(const book& lhs,const book& rhs); //friend comparator. If your fields are public,you may remove "friendship"
    friend bool author_compare(const book& lhs,const book& rhs);//friend comparator. If your fields are public,you may remove "friendship"
    friend void print(const book& arg);
};

bool pages_compare(const book& lhs,const book& rhs) // func for sorting by pages count
{
    return lhs.pages < rhs.pages;
}

bool author_compare(const book& lhs,const book& rhs) // func for sorting by author name
{
    return lhs.author < rhs.author;
}

void print(const book& arg) // custom printing
{
    cout << '{' << arg.author << "," << arg.pages << "} ";
}

int main()
{
    book book0{"aurelius",10};
    book book1{"bbbbbb",5};
    book book2{"ccccc",15};
    book book3{"au",100};
    vector<book> arr = {book0,book1,book2,book3};
    sort(arr.begin(),arr.end(),pages_compare); // sort by page count
    for(auto &i: arr) // print
        print(i); // {bbbbbb,5} {aurelius,10} {ccccc,15} {au,100} 
    cout << '\n';
    sort(arr.begin(),author_compare); // sort by author name
    for(auto &i: arr) // print
        print(i); // {au,100} {aurelius,10} {bbbbbb,5} {ccccc,15} 
}

我不确定为什么在基类上使用 dynamic_cast 会导致分段错误。我应该期望输出“派生显示”作为输出。有人可以给我任何线索和更好的解释。

解决方法

你把它倒过来了。 dynamic_cast 适用于您有一个指向 Base 的指针的情况,该指针可能指向派生对象。 dynamic_cast 可以让你测试是否是这种情况,如果是的话,它会给你一个派生的指针来使用。但请注意,它仅在您首先拥有派生对象的情况下才会这样做。 dynamic_cast 不会神奇地将 Base 对象转换为 Derived 对象。这在一般情况下是不可能的。

Base* ptr = ...;
Derived* ptr2 = dynamic_cast<Derived*>(ptr);
if (ptr2)
{
    cout << "derived object\n";
    // do something with ptr2
    ...
}
else
{
    cout << "base object\n";
}
,

正如其他人所说,你在这里做的是违法的事情。

您在这里尝试利用的多态性是关于指向具有其父接口的派生对象,但是当您尝试使用其子接口解释祖先的实例时,您将收到错误。

如果您想更好地检查如何在 C++ 中执行此技术,您可以查看解释基本原理的 cpluplus.com 参考页。然后,您可以在对这个主题有一个更好的全局了解后,再进一步详细说明。

所以,实际上,你想要的是

    base* d = new derived;
    d->display();

哪个输出

显示派生

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...