定义在具有纯虚拟函数和正则函数的类中是必要的吗

Is definition necessary in classes that have pure virtual functions AND regular functions?

本文关键字:函数 虚拟 定义      更新时间:2023-10-16

例如,如果您创建了一个具有一个纯虚拟函数但具有一个或多个非纯虚拟函数的类,您可以跳过创建实现文件,从而跳过类的定义吗?

如果有一个非虚拟函数,这是一样的吗?我猜不会…

您始终只能通过内联定义所有成员函数来使类成为头。这与函数是否为虚拟函数无关。此外,头文件几乎总是包含类定义(除非使用正向声明)。

澄清术语:

类别声明:

class C;

具有一个成员函数的类定义:

class C {
  void f();
};

具有一个内联定义的成员函数的类定义:

class C {
  void f() { ... }
};

这三种风格在不同的情况下都是可行和有用的。对于类模板,通常使用第三种样式来允许任意实例化。对于包含大量代码的普通类,第二种样式很流行,因为它减少了对象代码的大小和编译时间。

在不调用任何成员之前,您不需要有它们的声明,即使您的类不是抽象的。

这是一个很好的方法来禁止一些运算符-使它们成为私有的并且不声明,以确保这个运算符不会与这个类一起使用。

您不应该在基类中为纯虚拟函数创建定义,而应该为正则函数创建定义。在基类中定义纯虚拟方法没有任何意义。

此外,如果一个类是抽象类(即,如果它由纯虚拟函数组成),则必须继承它。此外,我们不能为抽象类创建对象

编辑部分:

class A{
public:
    int a;
    virtual void vDisplay() = 0; //Should not be defined in base class and must be defined in the derived class
    virtual int vGet(); //non pure Virtual function 
    void vSetA(int x); //non virtual member function must be defined
};
class B:public A{
    int b;
public:
    void vDisplay(); //should be defined in derived class
    int vGet();
    void vSetB(int x,int y);
};
int A::vGet(){
    return a;
}
void A::vSetA(int x){
    a = x;
}
void B::vDisplay(){
    cout<<"a="<<a<<"b="<<b;
}
int B::vGet(){
    return a;
}
void B::vSetB(int x, int y){
    a = x;
    b = y;
}