我正在尝试实现一个包含纯类虚函数的基类,基类将为其提供默认实现。目前,我的实现归结为:
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并已回答。而且我无法弄清楚我的代码如何与已接受的答案背道而驰。当我删除纯虚拟说明符时,代码将按预期编译并运行。
我在这里标记我的基础类别'作为纯虚函数并为它提供一个实现,派生类必须提供自己的实现?
答案 0 :(得分:2)
Ther错误消息告诉您不能使用纯虚函数分配类的对象。
这意味着你的问题是尝试初始化基类对象的int main函数。
答案 1 :(得分:2)
纯虚函数是虚函数,其实现必须由派生类提供。这是使你的虚函数变纯的原因之一,因此派生类必须具有它的实现。
virtual void function()=0
是纯虚函数,其中=0
表示它的纯度。
如果在类中有纯虚函数,则不应该创建类的实例。 (否则使功能纯虚拟没有多大意义)。这样的类是抽象类。
现在,在某些情况下,您可能希望拥有自己的纯虚函数实现,以便派生类可以直接使用它。因此,在某些情况下我们提供纯虚函数体。
如果要创建该类的实例,请不要使您的虚函数变纯。