将抽象参数传递给方法,为什么不呢

Pass abstract parameter to method, why not?

本文关键字:为什么不 方法 抽象 参数传递      更新时间:2023-10-16

我已经编写了一个抽象类(使用虚拟函数),我希望有一个方法接受一个这样的类作为参数。既然这个类是抽象的,我知道我不能把抽象类传递给任何方法,但为什么我不能把一个抽象类的子类传递给那个方法呢?如何指定参数应该是指定基类的任何子类?这一切都在C++中。

您需要将参数指定为指针(或引用),例如Abstract *而不是Abstract。如果Derived继承自Abstract,则当应为Abstract *时,可以传递类型为Derived *的变量,但当应为Abstract时,通常不能传递类型为Derived的变量。

然后在C++中使用多态性。

给定任何基类:

struct Base{};

及其子类:

struct SubClassA : public Base(){};
struct SubClassB : public Base(){};

如果您申报:

void MyFunctionReference(Base&){};
void MyFunctionPointer(Base*){};

然后您可以拨打:

{
   SubClassA a;
   SubClassB b;
   MyFunctionReference(a); // by reference
   MyFunctionPointer(&b); // by pointer address
}

您确实可以做到这一点,请观察:

纯抽象类:

class Abstract {
public:
    virtual void foo() = 0;
};

覆盖成员函数的子函数:

class AbstractImpl : public Abstract {
public:
    void foo() override { std::cout << "Hi from subclassn"; }
};

现在我们声明一个方法,该方法采用抽象类的引用类型

void somefunc(Abstract &ab) {
    ab.foo();
}

最后,我们主要实例化子类参数

int main() {
    AbstractImpl test;
    somefunc(test); // prints Hi from subclass
    return 0;
}

来源:https://stackoverflow.com/a/11422101/2089675