【问题标题】:Pass abstract parameter to method, why not?将抽象参数传递给方法,为什么不呢?
【发布时间】:2013-12-24 10:57:23
【问题描述】:

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

【问题讨论】:

  • 这就是使用继承的一半。只需让方法获取指向抽象类的指针,然后您就可以将指针传递给任何派生类。
  • “鉴于该类是抽象的,我知道我无法将抽象类传递给任何方法”。 仅当您限制自己按值传递时,这才是正确的。通常在处理抽象时使用多态性(通过引用传递或通过指针地址传递),更普遍地是任何基类/母类。

标签: c++ inheritance subclass base-class


【解决方案1】:

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

【讨论】:

  • 这是什么原因?限制参数的使用有什么意义?
  • @Jack 因为你不能实例化一个抽象类。
  • @Smac89 - 即使可以,按值传递它也会切片对象。
  • 您可以通过指针引用。请注意,cast 是您在源代码中编写的内容,用于告诉编译器进行 conversion。存在从Derived*Abstract* 的隐式转换和从Derived&Abstract& 的隐式转换。任何一个都不需要演员表。
  • @Jack 如果您尝试让您的函数按值获取Abstract,它将创建传入对象的副本。您不能创建Abstract 的副本,因为它是抽象的。即使它不是抽象的,也只会复制对象的基类部分。通过引用传递很好,它本质上与通过指针传递相同,只是语法不同。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    纯抽象类:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-12
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多