我有一个指针,我想指向共享一个abstract基类的类的不同实例,然后在该指针上调用一个函数,每个子类都有自己的实现(在基类中定义为虚拟)班级)。这可能吗?
我最初尝试过这个,现在我明白为什么它不起作用(我认为):
class Base{
virtual int Foo() = 0;
}
class Child1: public Base{
int Foo() override;
}
class Child2: public Base{
int Foo() override;
}
Child1 child1;
Child2 child2;
void *ptr;
switch (expression)
{
case 1:
ptr = &child1;
break;
case 2:
ptr = &child2;
break;
default:
break;
}
ptr->Foo();
C++ 一般来说,是一种静态类型语言:在源代码中的每一点,编译器都知道对象的“类型”。
你的
void* ptr
只是告诉编译器 ptr
指向“某物”——但是编译器不知道那个“某物”可能是什么,而且这不是像 Javascript 或 python 这样的东西,它只会查看“某物”来确定它是什么。你尝试使用 void* ptr
来完成几乎任何事情,编译器只会告诉你“抱歉,我不能这样做”。
如果您将代码更改为
Base* ptr
,那么编译器就知道这个 ptr
很好地指向至少是 Base
的东西。它不知道派生类是什么,但这就是 virtual
的用途——编译器可以在 virtual
对象上调用 Base
函数,并且最终会出现在我们真正的派生类中看着。