【发布时间】:2011-02-28 21:36:34
【问题描述】:
在 Delphi 中,我们可以选择执行以下操作:
TClass1 = class
procedure Test; virtual;
end;
TClass2 = class(TClass1)
procedure Test; override;
end;
所以在代码中,如果我创建一个 TClass2 的实例,即使我将对象转换为:
TClass1(ObjectClass2).Test;
应用程序将调用在 TClass2 上声明的函数。
但是在 C/C++ 中我找不到这样做的方法。
如果我将一些 void 声明为虚拟,并在我对父类进行强制转换时在子类中实现相同的 void,它将不会使用子类的实现。
有谁知道我如何在 C/C++ 中重现 Delphi 的行为?
新信息: 这些是我的文件。
---------------------- File Filho.hpp
#ifndef FILHO_HPP
#define FILHO_HPP
#include "Pai.hpp"
class Filho : public Pai {
public:
Filho();
virtual ~Filho();
void metodoX();
};
Filho::Filho() {}
Filho::~Filho() {}
void Filho::metodoX() {
std::cout << "Hello Filho!" << std::endl;
}
#endif
---------------------- File Pai.hpp
#ifndef PAI_HPP
#define PAI_HPP
#include <iostream>
class Pai {
public:
Pai();
virtual ~Pai();
virtual void metodoX();
};
Pai::Pai() {}
Pai::~Pai() {}
void Pai::metodoX() {
std::cout << "Hello Pai!" << std::endl;
}
#endif
---------------------- File Main.hpp
#include "Pai.hpp"
#include "Filho.hpp"
int main() {
Pai pai;
pai.metodoX(); //Here output the msg Hello Pai!
Filho filho;
filho.metodoX(); //Here output the msg Hello Filho!
((Pai) filho).metodoX(); //Here output the msg Hello Pai! , but here if I use the directive 'override' in Delphi, the output will be Hello Filho!. Here is my doubt.
return 0;
}
【问题讨论】:
-
你描述的应该可以。向我们展示您的 C++ 代码。
-
我将利用我的午餐时间发布我的代码并验证答案,tks in advice
-
@saCi 不同之处在于您正在创建基于堆栈的对象。如果您按照我的回答和 birryree 的回答在堆上创建对象,那么它的行为将与 Delphi 一样,并且如您所愿。
-
感谢 David Haffernan,我明白其中的区别。我会接受 biryree 的回答,因为他先发帖。但是感谢您的解释和耐心。
-
@Saci - 我看到您更新了执行此操作的代码:
((Pai)filho).metodoX();。因此,当您这样做时,您不会使用对基类的指针/引用。您只是将filho对象转换为Pai对象。这不会导致多态函数调用,而只会调用Pai::metodoX()函数。如果您改为这样做:((Pai*)filho)->metodoX();,它将多态地调用Filho的metodoX()。我已经用这个更新了我的答案。