【问题标题】:Redefinition of virtual method outside of class declaration C++在类声明 C++ 之外重新定义虚方法
【发布时间】:2020-11-20 15:33:16
【问题描述】:

我正在尝试使用公共 C++ 库并将其扩展为我的目的。要扩展它,我需要在单个类中更改单个虚拟方法。我试图覆盖的方法是继承类的一部分。我基本上在下面的代码中发布了我需要做的事情。我真的不想重命名该函数,因为它在许多其他地方都使用过,而且我不想更改库的源代码,因为它适用于某些情况,但不适用于我的具体情况。

#include <iostream>

class Base {
public:
    virtual void getName() = 0;
};

class Dynamic : public Base {
public:
    virtual void getName() {
        std::cout << "Wrong answer\n";
    }
};

//Error in redefinition of class method
void Dynamic::getName() {
    std::cout << "Right answer\n";
}

int main()
{
    Dynamic mydynam;
    mydynam.getName();
}

【问题讨论】:

  • 你只能有一个Dynamic::getName()的实现/定义。
  • 您不能重新定义方法。是什么阻止您更改 Dynamic 中的定义?
  • 您可以从Dynamic派生并覆盖派生类中的方法。
  • 如果你想扩展它,这个函数已经是虚函数了,它明确地允许你从Dynamic(或者根据需要从Base)派生一个类并使用它。您需要做的就是确保通过指针或引用(Base *Base &amp;Dynamic *Dynamic &amp; 等)使用该类,并且您的代码将按预期工作。无论如何,您不能像那样简单地重新定义Dynamic::getName() - 只允许定义一个函数。

标签: c++ inheritance overriding virtual


【解决方案1】:

这是基于上述 cmets 的代码示例。 MyDynamic 类派生自具有重新实现功能的 Dynamic 类。 它会给你正确的答案。

#include <iostream>

class Base {
public:
    virtual void getName() = 0;
};

class Dynamic : public Base {
public:
    virtual void getName() {
        std::cout << "Wrong answer\n";
    }
};

////////////////////////
class MyDynamic : public Dynamic {
public:
    void getName() {
        std::cout << "Right answer\n";
    }
};

int main()
{
    MyDynamic mydynam;
    mydynam.getName();
}

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2012-02-24
    • 2020-09-01
    相关资源
    最近更新 更多