【问题标题】:In C++, is it possible for child classes of an abstract class to take different parameters for the same fuctions?在 C++ 中,抽象类的子类是否可以为相同的功能采用不同的参数?
【发布时间】:2021-12-14 17:01:47
【问题描述】:

对不起,如果我没有很好地表达这个问题,但是说代码看起来像这样:

   Class Parent
    {
public:
    virtual void Sit() = 0;
    }

    Class Child1 : public Parent
    {
public:
    virtual void Sit(obj* chair) override;
    }

    Class Child2 : public Parent
    {
public:
    virtual void Sit(obj* bench) override;
    }

基本上,我需要我的对象从同一个抽象类继承,但它们需要为相同的函数接收不同的参数,因为它们具有不同的行为,我想这样的事情是可能的,但我不知道具体如何。

【问题讨论】:

  • 一旦你有不同的参数集,它就不是同一个函数。它被称为函数重载,你有两个版本。
  • 如果你想通过指向基类的指针调用函数,这是不可能的。
  • 您的示例没有演示采用不同的参数。 Child1::Sit()Child2::Sit() 都将 obj* 作为参数。如果您将Parent::Sit() 的声明更改为virtual void Sit(obj*) = 0,那么在此特定示例中您没有问题。
  • 使用多态性
  • 如果您确实需要不同的参数类型,那么您应该问自己为什么该函数存在于Parent 级别。如果你不能通过Parent* 有意义地调用Sit()(因为你不知道哪些参数是合适的),那么Sit() 不太可能在Parent 中定义。

标签: c++ visual-c++


【解决方案1】:

你不能真正做你想做的事,不完全是。如果您使用的是override,那么您必须完全从父级覆盖。否则它不是一个覆盖,你的编译器应该抱怨。

您可以让 Parent::Sit() 采用 void *,然后您的子类中的实现可以假设,尽管这有点危险。

如果 Sit() 的参数至少都继承自一个公共基类,那么您可以这样定义它。这比从void * 开始要好一些。

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 2022-08-18
    • 2017-01-19
    • 1970-01-01
    • 2012-08-17
    • 2023-02-22
    • 1970-01-01
    • 2016-03-07
    • 2021-09-19
    相关资源
    最近更新 更多