【问题标题】:Class with implementation of pure virtual function实现纯虚函数的类
【发布时间】:2016-02-18 07:44:32
【问题描述】:

我正在尝试实现一个包含纯虚函数的基类,该基类将为其提供默认实现。目前,我的实现归结为:

class Base {    
    public: 
    Base(string bVar);
    virtual string getVar() const =0; 

    private:
    string myBVar;
};

Base::Base(string bVar){
    this->myBVar = bVar;
}

string Base::getVar() const { //virtual function default implementation
    return this->myBVar;
}

class Derived : public Base {

    public:
    Derived(string dVar);
    string getVar() const; // implements pure virtual const base function

    private:
    string myDVar;
};

Derived::Derived(string dVar) : Base(""){
    this->myDVar = dVar;
}

string Derived::getVar() const { //virtual
    return this->myDVar;
}

int main(){

    Base aBaseObj("param");
    return 0;
}

当我编译这段代码时,我得到了这个错误:

错误:不能将变量 'aBaseObj' 声明为抽象类型 'Base' 并注意:因为以下虚函数在 'Base' 中是纯函数 ...virtual std::string Base::getVar() const

这个问题已经被问到before 并得到了回答。而且我无法弄清楚我的代码如何显着偏离接受的答案。当我删除纯虚拟说明符时,代码会按预期编译和运行。

关于将我的基类的函数标记为纯虚拟并为其提供派生类必须为其提供自己的实现的实现,我在哪里出错了?

【问题讨论】:

  • 您不能创建抽象类的实例。您的基类包含一个纯虚函数,因此无法创建它的实例。
  • @Rishit 看看链接的问题。我的实现有何不同?
  • 你的纯虚函数体的实现是正确的。但是你不能创建你的基类的实例,因为它包含纯虚函数。
  • 提供基类实现通常是为了派生类有一个直观命名的支持函数,如果他们想要这种行为(可能与他们自己之前或之后的额外行动)。这并不意味着您可以直接创建基类对象。
  • @amoeba 你可以,除非它是一个纯虚函数......纯虚函数(与普通虚函数相反)的全部意义在于你不能创建一个包含一个的类。

标签: c++ oop polymorphism


【解决方案1】:

纯虚函数是其实现必须由派生类提供的虚函数。这是使您的虚函数纯的原因之一,因此派生类必须具有它的实现。

virtual void function()=0 是纯虚函数,=0 表示它的纯度。

当你在一个类中有一个纯虚函数时,你不应该创建一个类的实例。 (否则将函数设为纯虚拟没有多大意义)。这样的类就是抽象类。

现在,在某些情况下,您可能希望拥有自己的纯虚函数实现,以便派生类可以直接使用它。因此我们在某些情况下提供纯虚函数体。

如果您想创建该类的实例,请不要将虚函数设为纯函数。

【讨论】:

    【解决方案2】:

    那个错误信息告诉你不能用纯虚函数分配类的对象。

    这意味着你的问题是 int main 函数试图初始化基类对象。

    【讨论】: