问题描述
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();
哪个输出
显示派生