我有以下代码(来自virtual functions and static_cast被盗):static_cast如何影响虚函数调用?
#include <iostream>
class Base
{
public:
virtual void foo() { std::cout << "Base::foo() \n"; }
};
class Derived : public Base
{
public:
virtual void foo() { std::cout << "Derived::foo() \n"; }
};
如果我有:
int main()
{
Base base;
Derived& _1 = static_cast<Derived&>(base);
_1.foo();
}
打印输出将是:Base::foo()
但是,如果我有:
int main()
{
Base * base;
Derived* _1 = static_cast<Derived*>(base);
_1->foo();
}
打印输出将b e:Segmentation fault: 11
老实说,我都不太明白。根据上面的例子,有人可以解释static_cast和虚拟方法之间的复杂性吗?顺便说一句,如果我想打印输出为“Derived::foo()
”,我该怎么办?
如果您对未初始化的指针进行调用,分段错误实际上是最好的结果。 –
要打印输出为Derived :: foo(),您需要确保Derived类型的实例存在,但在任何示例中都不存在。 – mungflesh
由于您没有任何实际的对象,因此您使用指针进行segfault。只是指针,还没有指向任何。所以'_1-> foo()'试图从一个随机内存位置读取虚拟表。如果您将指针更改为'Base base;派生* _1 = static_cast(&base);'然后你可以尝试调用'foo()',但你仍然应该得到'Base :: foo()',因为那是对象。你需要一个'Derived _2; _2.foo()'。 –
John