如何将 void 指针指向共享具有不同虚函数实现的不同对象?

问题描述 投票:0回答:1

我有一个指针,我想指向共享一个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++ pointers inheritance
1个回答
0
投票

C++ 一般来说,是一种静态类型语言:在源代码中的每一点,编译器都知道对象的“类型”。

你的

void* ptr
只是告诉编译器
ptr
指向“某物”——但是编译器不知道那个“某物”可能是什么,而且这不是像 Javascript 或 python 这样的东西,它只会查看“某物”来确定它是什么。你尝试使用
void* ptr
来完成几乎任何事情,编译器只会告诉你“抱歉,我不能这样做”。

如果您将代码更改为

Base* ptr
,那么编译器就知道这个
ptr
很好地指向至少是
Base
的东西。它不知道派生类是什么,但这就是
virtual
的用途——编译器可以在
virtual
对象上调用
Base
函数,并且最终会出现在我们真正的派生类中看着。

© www.soinside.com 2019 - 2024. All rights reserved.