如果您创建一个具有一个纯虚拟的类,但是一个或多个非纯虚函数,您是否可以跳过创建实现文件,从而跳过类的定义?
如果有非虚函数,这是否相同?我猜不是......
答案 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;
}