我正在学习C++继承,因此我通过动态创建基类来尝试此代码,并对其派生类进行了向下转换(显然,它对于向下转换无效)以便使这个动态创建的Base对象由Derived类指针指向。但是当我通过这个Derived指针调用方法who()
时,它会调用Derived类方法而不是Base类方法。C++继承:派生类指向基类调用Derived类方法
根据我的假设,没有为Derived类创建对象,那么如何调用非创建的Derived类对象的方法而不是实际创建的Base类对象?
我为这种现象搜索了一下,但是找不到一个清晰脆弱的解释来调用非创建的Derived类对象的方法。如果它是根据标准,然后解释我是如何工作的。 我知道,如果我制作方法virtual
,但这里使用的方法不是virtual
,故事会有所不同。
class parent{
public:
void who(){
cout << "I am parent";
}
};
class child : public parent{
public:
void who(){
cout << "I am child";
}
};
int main(){
child *c = (child *)new parent();
c->who();
return 0;
}
输出是I am child
但我预计I am parent
编辑:: 我没有在上面的代码中解脱出来了内存并提出了无效沮丧的,因为我只是想看看会发生什么。所以只解释调用方法的这种行为。
行为未定义。任何事情都可能发生。即使你让这个函数变成虚拟的,它也是一样的未定义的故事。 – molbdnilo
@molbdnilo:我不认为它在这个特殊情况下是未定义的。看到我非常好的答案。 –
@ P45Imminent - 行为未定义。事实上,你可以对观察到的行为进行理性解释并不会改变这一点。 “未定义的行为”意味着语言定义不会告诉您发生了什么;而已。 –