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

时间:2013-12-06 22:46:49

标签: c++ inheritance subclass base-class

我已经编写了一个抽象类(使用虚函数),并且我希望有一个方法接受一个这样的类作为参数。鉴于该类是抽象的,我理解我无法将抽象类传递给任何方法,但为什么我不能将抽象类的子类传递给该方法?如何指定参数应该是指定基类的任何子类?这都是用C ++编写的。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

然后在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
}

答案 2 :(得分:0)

你确实可以这样做,观察:

纯抽象类:

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

覆盖成员函数的子项:

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

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

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

最后在main中我们实例化子类参数

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

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