【发布时间】:2012-11-21 00:34:11
【问题描述】:
我对将基类对象的指针转换为派生类的指针感到困惑。 请检查以下代码:
derivate_class *d1 = (derivate_class*)cb;
d1->print();
d1->print1();
结果是:
谁能帮我解释一下为什么d1->print()会打印“我是base中的一个虚函数。”?
#include <iostream>
using namespace std;
class base
{
public:
virtual void print()
{
cout << "I'm a virtual function in base." << endl;
}
};
class derivate_class : public base
{
public:
void print()
{
cout << "I rewrite the virtual function in base." << endl;
}
void print1()
{
cout << "I'm a function in derivate class." << endl;
}
};
int main()
{
base* b = new base();
derivate_class *d = new derivate_class();
b->print();
d->print1();
base* cb = b;
b = d;
b->print();
cout << "*********************" << endl;
derivate_class *d1 = (derivate_class*)cb;
d1->print();
d1->print1();
system("pause");
return 0;
}
【问题讨论】:
-
你在调用UB——任何事情都有可能发生。切换到
dynamic_cast<>而不是 C 风格的强制转换并检查 nullptr。 -
@ildjarn,非常感谢您的回复。我正在阅读 STL 的源代码。在链表的 STL 中,它有一些代码将指向基对象的指针转换为派生类的指针。所以我在问题中编写代码来测试如果将指向基对象的指针转换为派生类的指针会发生什么。我真正的问题是我们什么时候需要将指向基对象的指针转换为派生类的指针?我将在下面发布 STL 代码。
-
@ildjarn,我开始一个新问题:stackoverflow.com/questions/13486010/…
标签: c++ pointers inheritance