【发布时间】:2018-09-30 18:08:24
【问题描述】:
我有一个如下所示的课程:
class MyClass {
public:
void doSomething() { // nothing here };
}
它还有一个看起来像这样的子类
class MyChildClass : MyClass {
public:
void doSomething() { // actual code here };
}
如您所见,doSomething() 函数在父类中什么也不做,但子类会覆盖它并添加实际代码。我的问题是我正在尝试做这样的事情:
MyClass foo = MyChildClass();
foo.doSomething();
我很震惊地发现,在这种情况下,MyClass,而不是 MyChildClass 的 doSomething() 版本被调用,即使 foo 实际上是 MyChildClass 类型。我在 Objective-C 方面的经验比 C++ 多得多,所以这对我来说很奇怪。似乎 C++ 正在确定需要在编译时调用哪个版本的 doSomething(),而不是在运行时检查对象的类型并调用正确的版本。
这对我来说是个问题,因为在我的实际代码中,我拥有的是一个父类和多个从它继承的不同子类。这些子类中的每一个都用自己独特的实现覆盖doSomething() 函数。我最终得到了一个充满MyClass 对象的std::vector(它实际上充满了许多不同类型的对象,每个对象都从MyClass 继承),我想遍历每个对象并调用它们的@987654334 版本@ 在编译时实际上不知道它们的类型。这在 Objective-C 中很容易,但是我有什么方法可以在 C++ 中完成这个吗?
【问题讨论】:
标签: c++ class introspection object-slicing