【问题标题】:Why do I have to implement a virtual function in a derived class if I want to use the base class implementation如果要使用基类实现,为什么必须在派生类中实现虚函数
【发布时间】:2017-01-20 08:33:58
【问题描述】:

我有一个纯虚拟基类和一个派生类。我知道我可以在基类中实现一个虚拟(非纯)方法。 我不明白的是为什么我HAVE 还要在派生类中实现相同的方法,如果我想要的只是使用基本实现:

#include <iostream>

using namespace std;

class Abstract {
public:
    int x;
    Abstract(){
        cout << "Abstract constructor" << endl;
        x = 1;
    }
    virtual void foo() = 0;
    virtual void bar(){
        cout << "Abstract::bar" << endl;
    }
};

class Derived : Abstract {
public:
    int y;
    Derived(int _y):Abstract(){
        cout << "Derived constructor" << endl;
    }
    virtual void foo(){
        cout << "Derived::foo" << endl;
    }
    virtual void bar(){
        Abstract::bar();
    }
};

int main()
{
   cout << "Hello World" << endl;
   Derived derived(2);
   derived.foo();
   derived.bar(); //HERE I HAVE TO DEFINE Derived::bar to use it
   return 0;
}

【问题讨论】:

  • 如果我不实现 Derived::bar 它不会编译
  • 阅读私有继承。
  • 您正在使用private 继承。这使得基类中的public 方法在派生类中变为private。你必须使用public继承,你可以做你想做的事
  • 为什么这个问题被否决了这么多?这是一个合理的问题,有一个很小的例子说明了这一点。
  • @statquant:不必重新实现Derived::bar。它是关于通过Derived 使其可访问。您通过使用 private 继承使其无法访问。您的重新实现解决了这种不可访问性。但是,如果您从一开始就使其可访问,则不需要这种解决方法。

标签: c++ virtual pure-virtual


【解决方案1】:

您不必这样做。您可以执行以下操作:

class Derived : public Abstract {

这样,您可以使用基类中的公共方法。

【讨论】:

  • 这充其量只是一个评论。
  • 我试图不实现Derived::bar,但它没有编译
  • 啊,好吧!确实,这个公众改变了一切!谢谢 !像往常一样在 C++ 所以你得到 -10 没有理由......当你不知道你能做到吗?
  • 问题文字和表述都很好。导致提出问题的误解就是问题所在。 This is covered early on in any good C++ text. 是的,你应该在提问之前阅读文本。研究不足是投反对票的合理原因。
  • @user4581301 我认为这太主观了……我们当然不能指望人们在提问之前阅读 C++ 书籍。不充分的研究应该与前 3 名的谷歌热门研究有关。
猜你喜欢
  • 2013-06-02
  • 2010-12-02
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2019-04-14
相关资源
最近更新 更多