在具有纯虚函数和常规函数的类中是否需要定义?

时间:2012-02-28 11:11:19

标签: c++

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

如果有非虚函数,这是否相同?我猜不是......

3 个答案:

答案 0 :(得分:4)

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

澄清术语:

班级声明:

class C;

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

class C {
  void f();
};

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

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

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

答案 1 :(得分:1)

在你不召集任何成员之前,即使你的班级不是抽象的,你也不需要他们的声明。

这是禁止某些运算符的好方法 - 将它们设为私有且无需声明,以确保此运算符不会与此类一起使用。

答案 2 :(得分:0)

您不应该在基类中为纯虚函数创建定义,但是您应该为常规函数创建定义。在基类中定义纯虚方法没有任何意义。

如果一个类是一个抽象类(即,如果它由纯虚函数组成),那么它必须是继承的。此外,我们无法为抽象类创建对象。

已编辑的部分:

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;
}