是的,我知道沮丧使用dynamic_cast
无法编译,如果Base
不是多态的,但我的问题不是这个。
class Base {
public:
virtual void bar()
{
cout << "bar\n";
}
};
class Derived: public Base {
public:
void foo()
{
cout << "foo\n";
}
};
int main()
{
Base *pb;
Derived *pd;
pb = new Derived; //Base* points to a Derived object
pd = dynamic_cast<Derived*>(pb);
pd->foo(); //outputs foo
pb = new Base; //Base* points to a Base object
pd = dynamic_cast<Derived*>(pb);
pd->foo(); //outputs foo, too. Why?
}
我以为当pb = new Derived;
, pb
实际上指向一个Derived
对象位于堆中。后pd = dynamic_cast<Derived*>(pb);
, pd
还指出Derived
对象,所以pd->foo()
应该可以。
但当pb = new Base;
, what pb
指向的是一个Base
堆中的对象,然后pd = dynamic_cast<Derived*>(pb);
,怎么可能pd->foo()
作品?做过dynamic_cast
关闭Base
堆中的对象变成Derived
object?
在 C++ 中,类的每个实例都有自己的数据类型版本,但所有类在内存中共享相同的函数(内联函数除外)。就你而言,当你说这样的话:
pd->foo();
你本质上是在打电话Derived::foo
,这是内存中的一个函数,编译器知道它在哪里。问题是,它并不依赖于pd
根本不。但是,如果你有这样的事情:
class Derived : public Base {
private:
int a;
public:
Derived() { a = 100; }
void foo() {
std::cout<<a<<std::endl;
}
};
Then, pd->foo()
会导致分段错误。在这里,你的动态转换失败了,当Derived::foo
被调用,被传递0
as the this
目的。在之前的例子中,这很好,因为this
对象从未被使用过。然而,在第二种情况下,它被使用,因此导致分段错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)